You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:40:48