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

如何获取gnuplot中X/Y轴比例关系以准确定位标签

问题描述

我用gnuplot绘制圆形数据,代码如下:

$DATA<<EOD
1.0000,"CAN",80.6600,1.6700,0.2879,
2.0000,"DEU",79.8400,1.3600,0.4134,
3.0000,"DNK",78.6000,1.8400,0.2144,
4.0000,"EGY",72.7300,2.7800,0.4077,
5.0000,"GBR",80.0500,2.0000,0.3610,
6.0000,"IRN",72.4900,1.7000,0.3906,
7.0000,"IRQ",68.0900,4.7700,0.2810,
8.0000,"ISR",81.5500,2.9600,0.2195,
9.0000,"RUS",68.6000,1.5400,0.5696,
10.0000,"USA",78.0000,2.0000,1.0000,
EOD
set datafile separator comma
set style data circles
set term windows
unset xtics; unset ytics; unset x2tics; unset y2tics
set grid xtics layerdefault
set grid ytics layerdefault
set xtics nomirror
set ytics nomirror
set border 3.00000
set colorsequence classic
set title "This is My Title"
set xlabel "Cities"
set ylabel "Population (in Millions)"
set key default
set style fill solid 4.00 transparent
plot $DATA every ::0::0 using ($3):($4):($5) title "CAN",
$DATA every ::1::1 using ($3):($4):($5) title "DEU",
$DATA every ::2::2 using ($3):($4):($5) title "DNK",
$DATA every ::3::3 using ($3):($4):($5) title "EGY",
$DATA every ::4::4 using ($3):($4):($5) title "GBR",
$DATA every ::5::5 using ($3):($4):($5) title "IRN",
$DATA every ::6::6 using ($3):($4):($5) title "IRQ",
$DATA every ::7::7 using ($3):($4):($5) title "ISR",
$DATA every ::8::8 using ($3):($4):($5) title "RUS",
$DATA every ::9::9 using ($3):($4):($5) title "USA",
$DATA every ::9::9 using ($3):($4)+($5):($2) with labels center notitle,
$DATA every ::9::9 using ($3)-($5):($4):($2) with labels center notitle,
$DATA every ::9::9 using ($3):($4)-($5)/2+0.1:($2) with labels center notitle

我尝试在圆形上方、左侧、下方添加标签,左侧标签定位正常,但因为X/Y轴比例不同,上方标签定位失效;下方标签的临时计算只对USA数据有效,对小数据点不起作用。想知道除了执行show xrange/show yrange命令外,有没有方法获取X/Y轴的比例关系,用来计算上下标签的偏移量?已经试过set view equal xy但没效果,show size显示当前比例为1,1。


解决方案

1. 自动获取X/Y轴比例系数

gnuplot内置了一系列变量可以直接获取轴范围和终端尺寸,无需手动执行show命令:

  • GPVAL_X_MIN/GPVAL_X_MAX:X轴自动计算的最小/最大值
  • GPVAL_Y_MIN/GPVAL_Y_MAX:Y轴自动计算的最小/最大值
  • GPVAL_TERM_XSIZE/GPVAL_TERM_YSIZE:终端窗口的像素宽度/高度

通过这些变量可以计算出数据单位与像素单位的转换关系,进而得到X/Y轴的视觉比例:

# 先执行一次空plot触发gnuplot计算轴范围
plot $DATA using ($3):($4):($5) notitle
# 计算轴的数据范围宽度
x_range = GPVAL_X_MAX - GPVAL_X_MIN
y_range = GPVAL_Y_MAX - GPVAL_Y_MIN
# 计算每个数据单位对应的像素数
x_pix_per_unit = GPVAL_TERM_XSIZE / x_range
y_pix_per_unit = GPVAL_TERM_YSIZE / y_range
# 得到Y轴数据单位相对于X轴的缩放系数(即1个X单位的像素长度等于多少个Y单位)
y_scale_factor = x_pix_per_unit / y_pix_per_unit

2. 用比例系数修正标签位置

得到y_scale_factor后,就可以用它来调整上下标签的Y轴偏移量,确保视觉上的对称:

# 上方标签:偏移量乘以缩放系数,抵消轴比例差异
$DATA using ($3):($4) + ($5)*y_scale_factor :($2) with labels center notitle
# 下方标签:同理调整偏移量
$DATA using ($3):($4) - ($5)*y_scale_factor :($2) with labels center notitle
# 左侧标签:X轴同单位偏移,无需调整
$DATA using ($3)-($5):($4):($2) with labels center notitle

3. 简化绘图代码

你当前逐个绘制每个数据点的方式过于繁琐,可以一次性绘制所有圆形:

plot $DATA using ($3):($4):($5):($2) with circles title columnheader(2), \
     $DATA using ($3):($4)+($5)*y_scale_factor:($2) with labels center notitle, \
     $DATA using ($3)-($5):($4):($2) with labels center notitle, \
     $DATA using ($3):($4)-($5)*y_scale_factor:($2) with labels center notitle

4. 关于set view equal xy无效的说明

set view equal xy仅适用于3D绘图,2D场景下要强制等比例轴,使用set size ratio -1,它会让X/Y轴的单位长度视觉一致,此时标签偏移量可以直接用数据单位计算,无需额外转换。不过这个命令会改变图表整体尺寸,需根据需求选择。


内容的提问来源于stack exchange,提问作者Marionette_66

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:09:53