如何用gnuplot绘制带标签的直方图?标签偏移问题求解
问题描述
我有两个小型数据文件:
- 第一个文件(
file1.dat)内容:
11 365.4 12 659.2
- 第二个文件(
file2.dat)内容:
11 432.1 12 882.4
我尝试用gnuplot绘制带标签的直方图,写了如下脚本:
gnuplot <<EOF set output 'house-energy.png' set terminal png size 800,400 font "Arial,10" set boxwidth 0.7 relative set grid ytics linestyle 0 set style fill solid 0.20 border set style data histogram #set style histogram columnstacked #set style histogram rowstacked set title "Energy" set xlabel "Month" set ylabel "kWh" set yrange [0:2000] plot 'file1.dat' u 2: xtic(1) with histogram lc rgb "#0045FF" title "Energy house total", \ '' using 1:($2):($2) with labels notitle font ",10" , \ 'file2.dat' u 2: xtic(1) with histogram lc rgb "#004500" title "Labb", \ '' using 1:($2):($2) with labels notitle font ",10" EOF
但绘制出的标签位置严重偏移,需要解决这个问题,正确画出带标签的直方图。
解决方案
标签偏移的核心原因是:你用using 1:($2)指定标签位置时,$1取的是原始数据里的月份数值(11、12),但直方图的x轴位置不是直接对应原始x值,而是gnuplot自动分配的类别位置(比如第一个月份分组对应x=1,第二个对应x=2)。要修正标签位置,得针对直方图的布局调整坐标:
1. 先明确直方图的x轴位置规则
当用set style data histogram且未开堆叠时,同一分组的柱子会并列摆放:
- 月份11的两个柱子,x位置分别是
1 - 0.35和1 + 0.35(对应你设置的boxwidth 0.7,一半就是0.35) - 月份12的两个柱子,x位置分别是
2 - 0.35和2 + 0.35
2. 修改脚本里的标签位置计算
把标签的x坐标换成直方图对应的类别位置,再调整偏移量让标签落在柱子正上方,同时给y轴加小偏移避免和柱子顶重叠:
修正后的完整脚本:
gnuplot <<EOF set output 'house-energy.png' set terminal png size 800,400 font "Arial,10" set boxwidth 0.7 relative set grid ytics linestyle 0 set style fill solid 0.20 border set style data histogram set style histogram clustered gap 1 # 显式指定分组间距,方便位置计算 set title "Energy" set xlabel "Month" set ylabel "kWh" set yrange [0:2000] # 偏移量取boxwidth的一半,让标签对齐柱子中心 offset = 0.35 plot 'file1.dat' u 2: xtic(1) with histogram lc rgb "#0045FF" title "Energy house total", \ '' using ($0 + 1 - offset):($2 + 20):sprintf("%.1f", $2) with labels notitle font ",10", \ 'file2.dat' u 2 with histogram lc rgb "#004500" title "Labb", \ '' using ($0 + 1 + offset):($2 + 20):sprintf("%.1f", $2) with labels notitle font ",10" EOF
关键修改点说明
$0 + 1:$0是数据行号(从0开始),加1后对应直方图的第1、2个分组位置± offset:让标签精准对齐对应柱子的中心$2 + 20:给标签加个小y轴偏移,避免和柱子顶部贴在一起sprintf("%.1f", $2):格式化标签文本,保留一位小数更整洁
内容的提问来源于stack exchange,提问作者G Hasse
相关产品推荐
相关产品推荐

