如何用gnuplot生成灰度分组箱线图并输出EPS格式?
解决Gnuplot EPS灰度分组箱线图线条样式统一问题
问题出在EPS终端默认会自动循环分配不同的线条样式,导致每个箱线的样式都不一样。要实现同类型(如所有公司的第一个箱线)样式统一,需要手动预定义灰度线条样式,并在绘制时为对应分组指定样式,具体步骤如下:
1. 配置EPS终端与自定义灰度线条样式
首先设置EPS终端,并定义对应每个分组的灰度线条样式(比如3个样式对应3类箱线),可通过灰度值或RGB灰度码设置,同时可搭配线条宽度、虚线样式增强区分度:
# 设置EPS终端,指定字号并强制灰度渲染 set terminal postscript eps enhanced 24 monochrome set output "fruit_prices.eps" # 定义3种自定义灰度线条样式,对应3类箱线 set style line 1 lc gray 0.0 lw 2 dt solid # 黑色粗实线,对应第一类箱线 set style line 2 lc gray 0.4 lw 2 dt 1 # 深灰色短虚线,对应第二类箱线 set style line 3 lc gray 0.7 lw 2 dt 2 # 浅灰色长虚线,对应第三类箱线
说明:
lc gray后接0.0(纯黑)到1.0(纯白)的数值,lw设置线条宽度,dt指定虚线类型(solid为实线,1/2为不同虚线样式)。
2. 绘制时指定对应线条样式
参考原示例的分组逻辑,在绘制每个公司的箱线图时,为同一类箱线指定相同的预定义样式。假设你的数据文件为dataA.txt、dataB.txt、dataC.txt,每列对应一类箱线,可通过以下两种方式实现:
方式1:手动指定每个系列的样式
# 公司A的3类箱线,分别对应样式1、2、3,x轴偏移-0.2 plot 'dataA.txt' using (1-0.2):1 with boxplot ls 1 title "公司A-类别1", \ 'dataA.txt' using (2-0.2):2 with boxplot ls 2 title "公司A-类别2", \ 'dataA.txt' using (3-0.2):3 with boxplot ls 3 title "公司A-类别3", \ # 公司B的3类箱线,x轴无偏移,对应相同样式 'dataB.txt' using (1):1 with boxplot ls 1 title "公司B-类别1", \ 'dataB.txt' using (2):2 with boxplot ls 2 title "公司B-类别2", \ 'dataB.txt' using (3):3 with boxplot ls 3 title "公司B-类别3", \ # 公司C的3类箱线,x轴偏移+0.2,对应相同样式 'dataC.txt' using (1+0.2):1 with boxplot ls 1 title "公司C-类别1", \ 'dataC.txt' using (2+0.2):2 with boxplot ls 2 title "公司C-类别2", \ 'dataC.txt' using (3+0.2):3 with boxplot ls 3 title "公司C-类别3"
方式2:用循环简化代码(更高效)
如果公司和类别数量较多,可通过循环变量绑定样式:
# 定义公司列表与x轴偏移量 companies = "A B C" x_offsets = [-0.2, 0, 0.2] # 双层循环:遍历每个公司,再遍历每个类别,指定对应样式 plot for [c=1:words(companies)] for [f=1:3] \ sprintf("data%s.txt", word(companies, c)) \ using (f + x_offsets[c]):f with boxplot ls f \ title sprintf("公司%s-类别%d", word(companies, c), f)
这样所有公司的同一类别箱线都会使用相同的灰度线条样式,和原示例的配色逻辑完全匹配。
内容的提问来源于stack exchange,提问作者THLO
相关产品推荐
相关产品推荐

