Gnuplot绘制直方图:如何仅显示每第10个自定义X轴标签
解决Gnuplot直方图自定义X轴标签仅显示每第10个的问题
我明白你的痛点——想用自定义X轴标签画直方图,但标签太密,设置set xtics 0,10后又把自定义标签换成了行号,完全不是想要的效果。别担心,咱们换个思路就能搞定!
问题根源
你之前用set xtics 0,10是在告诉gnuplot生成等间隔的数值型刻度,这会直接覆盖掉你从数据文件第2列读取的自定义标签,所以才会显示行号(gnuplot默认的刻度值)。咱们需要的是从自定义标签里筛选每第10个显示,而不是替换成数值刻度。
解决方案:条件判断显示标签
直接在plot命令里通过行号判断,只给每第10个数据点显示自定义标签,其他的留空即可。gnuplot里的$0代表当前数据行的索引(从0开始计数),我们可以用它来做判断:
# 先设置X轴标签的旋转和偏移,保持你想要的样式 set xtics rotate by 90 offset first +0.5,0 right # 绘制直方图,仅显示每第10个自定义标签 plot 'histo.raw' using 3:xtic(int($0)%10 == 0 ? stringcolumn(2) : '') with boxes lc rgb 'orange' title 'data'
代码解释
int($0)%10 == 0:判断当前行是不是第10的倍数(第1行、第11行、第21行……对应索引0、10、20……)stringcolumn(2):直接读取数据文件第2列的自定义标签字符串: '':如果不是第10的倍数,就用空字符串作为标签,相当于不显示这个位置的标签
如果你的数据行索引需要从1开始判断(比如想从第10行开始显示),只需要把判断条件改成int($0+1)%10 == 0就行。
另一种进阶方法:用数组存储标签
如果需要更灵活的标签控制,可以先把所有自定义标签存入数组,再按需调用:
# 统计数据行数,同时把第2列的标签存入数组labels stats 'histo.raw' using (labels[$0+1] = stringcolumn(2)) nooutput set xtics rotate by 90 offset first +0.5,0 right plot 'histo.raw' using 3:xtic(int($0)%10 == 0 ? labels[$0+1] : '') with boxes lc rgb 'orange' title 'data'
这种方法适合后续需要多次复用标签的场景,不过对于你的需求来说,第一种简洁的写法就足够了。
内容的提问来源于stack exchange,提问作者Gert Gottschalk
相关产品推荐
相关产品推荐

