Gnuplot分组柱状图问题:分类着色与子类别xtic异常排查
搞定Gnuplot分组柱状图的两个坑:颜色乱跳+XTic标签失踪
嘿,我帮你排查下这个问题,刚好之前做分组柱状图的时候踩过一模一样的坑!咱们一步步来分析:
一、为啥会出这俩问题?
1. 所有类别都显示三种颜色?
这大概率是你没给每个大类别(cat1/cat2/cat3)锁死固定颜色,反而让gnuplot默认循环用颜色了。比如如果你的plot命令里用了lc cycle或者没指定固定的linecolor,它就会给每个子类别(i1/p1/n1这类)挨个分配颜色,结果就是每个大组的柱子颜色都乱了,不是你想要的“一组一个色”。
2. 每组只显示最后一个XTic标签?
这个是X轴坐标算错了!同一组的子类别柱子都挤到同一个X位置上了,后面的标签直接把前面的覆盖掉。说白了就是你没给每个柱子设置偏移量,或者XTic的位置没对应到每个柱子的中心,导致标签重叠到只剩最后一个。
二、直接上修正方案(带完整代码+数据示例)
第一步:先把数据文件格式捋顺
假设你的sample.dat应该是这样的结构(每行对应一个子类别,后面三列是三个大类别数值):
# 子类别 cat1数值 cat2数值 cat3数值 i1 2.1 1.5 0.8 i2 3.2 2.3 1.1 i3 1.8 0.9 1.5 p1 2.5 1.7 0.6 p2 3.0 2.0 0.9 p3 1.9 1.2 1.3 n1 2.2 1.6 0.7 n2 3.1 2.2 1.0 n3 1.7 1.0 1.4
第二步:修正后的Gnuplot代码
这段代码完美实现你要的效果:大组一个颜色,组内用不同填充图案区分,所有子类别标签都显示出来:
# 先搞全局设置 set terminal pngcairo enhanced font 'Arial,10' size 800,500 set output 'grouped_bar_fix.png' set style data histogram set style histogram clustered gap 1 # 组内柱子留间隙,别挤在一起 set style fill solid border -1 set boxwidth 0.25 # 每个柱子的宽度,别太宽导致重叠 # X轴标签设置:旋转45度避免重叠,调整位置防止被截断 set xtics rotate by 45 right offset 0,-0.5 # 标题和图例 set title "分组柱状图:大类别分颜色,子类别分图案" set key outside right top vertical # 图例放外面,别挡柱子 # 核心:给每个大类别锁死颜色,组内用不同填充图案 plot 'sample.dat' using 2:xtic(1) title 'cat1' lc rgb '#1f77b4' fill pattern 1, \ '' using 3 title 'cat2' lc rgb '#ff7f0e' fill pattern 4, \ '' using 4 title 'cat3' lc rgb '#2ca02c' fill pattern 7
三、关键修正点说清楚
- 锁死大类别颜色:用
lc rgb直接指定每个大组的颜色(比如cat1用蓝色,cat2橙色,cat3绿色),彻底避免gnuplot乱循环颜色。 - 组内用图案区分:通过
fill pattern N给每个大组的子类别分配不同填充样式(gnuplot里pattern 1-9对应不同的斜线/点状填充)。 - XTic标签不重叠:
using 2:xtic(1)把第一列的子类别标签直接绑定到每组的X位置,clustered gap 1让组内柱子分散开,不会挤在一起覆盖标签。 - 标签旋转调整:
rotate by 45解决子类别名字太长导致的重叠问题,offset调整位置防止标签被X轴截断。
如果你的原始数据格式不是这样(比如按大组分行),只需要调整using后面的列索引就行,核心思路不变:给大组固定颜色,让每个子类别柱子在X轴上有独立位置,标签一一对应。
内容的提问来源于stack exchange,提问作者ksn
相关产品推荐
相关产品推荐

