如何在Gnuplot中为直方图每个条形设置对应名称的图例?
解决Gnuplot直方图图例显示异常问题
问题回顾
你有如下格式的数据集(CSV格式):
"name01","9.3","1" "name02","8.68","2" "name03","8.57142857143","3" "name04","8.45454545455","4" "name05","8.34518174511","5" "name06","8.22222222222","6" "name07","8.16666666667","7" "name08","8.14053254438","8" "name09","8.11111111111","9" "name10","7.93939393939","10" "name11","7.92307692308","11" "name12","7.89285714286","12" "name13","7.81818181818","13" "name14","7.8125","14" "name15","7.77777777778","15" "name16","7.70588235294","16" "name17","7.66101694915","17" "name18","7.65714285714","18" "name19","7.45054945055","19" "name20","7.425","20" "name21","7.30769230769","21" "name22","7.20689655172","22"
使用你提供的Gnuplot代码时遇到两个问题:
- 仅显示一个图例,内容为
9.3而非name01 - 其余所有条目的图例都未显示
问题原因
你的代码默认把整个第二列作为单个直方图系列,所以只会生成一个图例;同时key(1)的用法在这里没有正确关联到第一列的名称,导致图例内容错误。要让每个条形对应独立图例,需要把每个条目作为单独的系列来绘制。
修正后的Gnuplot代码
set terminal pngcairo enhanced size 1600,600 set output 'myhistogram.png' set title "My Histogram" font "Arial, 14" set auto x set yrange [0:*] # 关闭默认的histogram样式,改用boxes手动绘制每个条形 unset style data set key invert reverse Left outside set ytics 1 unset xtics set style fill solid border -1 set palette color model HSV set palette defined ( 0 0 1 0, 1 0 1 1, 6 0.8333 1 1, 7 0.8333 0 1) unset colorbox set boxwidth 0.8 set datafile separator "," # 统计数据获取最大值,设置y轴范围 stats "password_length_area.csv" using 2 nooutput set yrange [0:STATS_max * 1.2] # 使用for循环遍历每一行,将每个条目作为单独系列绘制 # 使用word函数提取第一列的名称作为图例标题 plot for [i=0:21] "password_length_area.csv" using (i):2:3:1 with boxes lc palette title word(stringcolumn(1),1)
关键修改说明
- 取消默认histogram样式:
unset style data,因为默认histogram会把同一列合并为一个系列,无法生成多个图例。 - 循环绘制每个条形:
for [i=0:21]遍历22个条目(索引从0到21),用(i)作为x轴位置,确保每个条形依次排列。 - 正确设置图例标题:
title word(stringcolumn(1),1)提取第一列的名称(去掉引号)作为每个条形的图例标题。 - 保留颜色映射:
lc palette依然使用你定义的HSV调色板,确保每个条形颜色不同。
这样修改后,每个条形都会对应name01到name22的独立图例,且图例内容正确显示。
内容的提问来源于stack exchange,提问作者redcrow
相关产品推荐
相关产品推荐

