Gnuplot中图例(Key)的横向排序(转置)实现方法
遇到这种图例排列顺序的问题很常见,核心原因是gnuplot默认的横向图例是按列优先填充的,而你需要的是行优先排列。不用修改绘图循环的话,有两个实用的解决方案,我帮你整理好了:
解决方案1:使用rowfirst关键字(推荐,适用于gnuplot 5.2及以上版本)
从gnuplot 5.2版本开始,新增了rowfirst选项,它可以直接让横向布局的图例按行优先的顺序填充条目,完美匹配你想要的1 2 3 / 4 5 6 / 7 8 9排列效果。
你只需要在原有的set key命令里加上rowfirst参数即可:
set key top left box horizontal maxcols 3 width 2 spacing 1.5 rowfirst
修改后的完整代码如下:
set terminal postscript eps enhanced size 17cm,13.125cm colour 18 "Helvetica" set output 'MWETransposeKey.eps' set xrange [0:1] set xtics 1 set yrange [-1:1.5] set ytics 1 # 加入rowfirst参数,让图例按行优先排列 set key top left box horizontal maxcols 3 width 2 spacing 1.5 rowfirst N = 9.0 # 定义正弦函数 f(x,n) = sin((x - 0.5*(n-1)/N)*(2*pi)) plot for [n=1:N] f(x,n) w l title sprintf("Line %d",n)
运行这段代码后,图例就会按行排列:第一行是Line 1、Line 2、Line 3,第二行是Line 4、Line 5、Line 6,第三行是Line 7、Line 8、Line 9,完全符合你的需求,而且不需要调整绘图循环的顺序。
解决方案2:手动指定图例条目顺序(兼容旧版本gnuplot)
如果你的gnuplot版本低于5.2,没有rowfirst选项,可以通过手动指定图例条目顺序的方式实现需求。原理是先绘制所有曲线但不显示默认图例,再逐个指定每个曲线的图例标题和顺序:
set terminal postscript eps enhanced size 17cm,13.125cm colour 18 "Helvetica" set output 'MWETransposeKey.eps' set xrange [0:1] set xtics 1 set yrange [-1:1.5] set ytics 1 set key top left box horizontal maxcols 3 width 2 spacing 1.5 N = 9.0 f(x,n) = sin((x - 0.5*(n-1)/N)*(2*pi)) # 先绘制所有曲线,暂时不显示图例(设置title为空) plot for [n=1:N] f(x,n) w l title "" # 手动按1-9的顺序指定每个图例条目 set key entry 1 title "Line 1" set key entry 2 title "Line 2" set key entry 3 title "Line 3" set key entry 4 title "Line 4" set key entry 5 title "Line 5" set key entry 6 title "Line 6" set key entry 7 title "Line 7" set key entry 8 title "Line 8" set key entry 9 title "Line 9" # 重新绘制以应用新的图例设置 replot
这个方法完全脱离绘图循环的顺序限制,能精准控制每个图例条目的位置。
为什么invert不符合你的需求?
你之前尝试的invert关键字是用来反转整个图例的条目顺序,它会把原来的列优先顺序直接倒转,得到的是3 6 9 2 5 8 1 4 7,本质还是列优先的反转,并不是你需要的行优先排列,所以这个参数不适用当前场景。
内容的提问来源于stack exchange,提问作者BubbleTrouble
相关产品推荐
相关产品推荐

