【问题标题】:Gnuplot: how to add y2 axis scale for different unitsGnuplot:如何为不同的单位添加 y2 轴刻度
【发布时间】:2012-12-07 19:36:56
【问题描述】:

我正在绘制文件中的数据。数据点采用公制单位。我想在右侧 (y2) 显示标准单位的第二个刻度。

该文件表示火箭发动机推力随时间的变化。数据以牛顿为单位。我想在左边显示牛顿(这自然会发生),在右边显示磅力。转换是一个简单的因数(将 N 乘以 0.2248 得到 lbf)。

我可以设置 y2tics,如果我手动设置 y2range,它们会出现在右侧。我不知道如何将 y2range 自动设置为 y1range * 一个因子。

我的最终解决方案是绘制两次,一次在 y1 上以牛顿为单位,一次在 y2 上以磅为单位,并使 y2 绘图几乎不可见:

plot '-' using 1:($2*0.2248) with dots axes x1y2 lc rgb 'white' notitle, \
      '' using 1:2 with lines lc rgb '<color>' title '<title>'

上述解决方案通常会生成略微不同的 y 刻度:使用 autoragne,gnuplot 会向上取整范围,因此每个轴上的顶部刻度是一个整数,当然不同单位的取整是不同的。

最终我得到的 Python 代码可以在每个图中找到最高推力值,然后我明确地将 yrange 设置为该数字,并将 y2range 设置为该数字 * 0.2248:

f.write("set yrange [0:%s]; set y2range[0:%s]\n" % (peak_thrust, peak_thrust*NEWTON_LBF));

这是最终结果:http://www.lib.aero/hosted/motors/cesaroni_12-15-12.html(下图示例)

【问题讨论】:

  • 很好的信息。从 2017 年 11 月开始感谢您。但是,我看到您说“带点”,但我没有看到任何点。另外,你能展示一下你的数据文件是什么样子的吗?

标签: gnuplot


【解决方案1】:

在我看来,最简单的方法就是简单地缩放数据:

set y2tics
plot sin(x) w lines, 5*sin(x) w lines axes x1y2

当然,您是从文件中绘制数据,所以它看起来更像:

set y2tics
FACTOR=0.2248  #conversion factor from newtons to lbf
plot 'datafile' u 1:2 w lines, '' u 1:(FACTOR*$2) w lines

如果您明确设置 yrange(您可能需要这样做):

set yrange [ymin:ymax]
set y2range [ymin*FACTOR:ymax*FACTOR]

最后,如果你真的想依赖自动缩放,你需要做一些“体操”。

首先,设置一个虚拟终端,这样我们就可以plot 而不进行绘图:

set term unknown
plot 'datafile' u 1:2  #collect information on our data

现在我们已经收集了数据信息,我们可以设置我们的真实y2range

FACTOR=0.2248
set y2range [FACTOR*GPVAL_Y_MIN : FACTOR*GPVAL_Y_MAX]
set y2tics nomirror
set ytics nomirror

现在设置终端并绘制数据:

set term ...
set output ...
plot 'datafile' u 1:2 w lines

【讨论】:

  • 所以归结为我需要绘制数据两次,每个 y 轴一次?
  • @iter -- 我想不是真的。 (请参阅我更新的代码)。如果您明确设置 y2range,则可以解决此问题。
  • 我在上面看到的每个代码 sn-p 都会绘制两次(除了明确设置范围的代码,我不想这样做;我依赖自动缩放)。最后一个 sn-p 绘图也两次,它只是将第一个绘图扔掉(到假终端)
  • @iter -- 是的,这是真的。您需要读取数据两次。如果您要自动缩放,则设置一次。这个脚本的性能真的有那么大的问题吗?
  • 我最终做的有点像你的第二种方法,但有明确的轴并使第一个图几乎不可见:
【解决方案2】:

5.0 版增加了对yy2(或xx2)轴之间的这种关系的支持:

set xrange[0:370]
set ytics nomirror
set y2tics
set link y2 via 0.2248*y inverse y/0.2248
plot x

【讨论】:

  • 如果 y 轴和 y2 轴都是对数轴,我无法让它工作 :( 有一个讨论 here
  • @vagoberto 抱歉,无法帮助您。我想这根本行不通。我尝试将 y 和 y2 的链接与 set nonlinear(新添加到 CVS)结合起来,但你不能将它们结合起来。
  • 感谢您提供此信息。直接使用 set link y2=something in terms of Y 非常适合简单的转换,例如一侧的 Deg F 和另一侧的 Deg C。
【解决方案3】:

我知道这是一个老问题,答案已被接受,但我认为值得分享我的方法。

我只是对 x2axis 使用修改后的标签。在你的情况下,这将是

set y2tics ("10" 10/0.2248, "20" 20/0.2248 etc etc...

可以这样循环

do for [i=0:1000:10] { set y2tics add (sprintf("%i",i) i/0.2248) }

for 范围应根据您的数据进行调整(您可以使用stats 和变量GPVAL_DATA_Y_MAX 完全放心)。 别忘了

set ytics nomirror

这将准确地给出您正在寻找的东西,在(几乎)一个班轮中:

如果您想使用网格并将转换后的因子放在x2axis 上,例如标签 y=50 N 将对应 y2=11.2(如果您使用网格,它会保持整洁)您可以做

do for [i=0:1000:50] { set y2tics add (sprintf("%5.1f",i*0.2248) }

这是结果:

【讨论】:

  • 非常值得添加。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多