GNUPlot:设置标签动画

GNUPlot:设置标签动画,gnuplot,Gnuplot,我的问题,从上一个问题开始,现在是这样的:我有一个粒子在平面中移动,现在我想在侧面有一个盒子,上面写着粒子在XY中的位置和速度。我试着使用标签,但它们最终相互重叠 下面是我想看到的一个非常粗糙的“草图”: +------------------------------------------+ | +-----------+ | | | | t = 2 |

我的问题,从上一个问题开始,现在是这样的:我有一个粒子在平面中移动,现在我想在侧面有一个盒子,上面写着粒子在XY中的位置和速度。我试着使用标签,但它们最终相互重叠

下面是我想看到的一个非常粗糙的“草图”:

    +------------------------------------------+
    |         +-----------+                    |
    |         |           |       t = 2        |
    |         | PLOT HERE |  x = 0    y = 1    |
    |         |           |  vx = 2   vy = 3   |
    |         +-----------+                    |
    +------------------------------------------+
这些数字在每一帧都会发生变化。我已经能够制作一个标题的动画,但标签似乎不同

我当前的代码看起来很像这里的答案,但有一些小的风格修改,我删除了标题。我可以生成只是XY坐标的数据,这就是我现在使用的

我还可以生成这样的结果(这些是随机点,只是为了说明)


用于设置标签动画

从数据文件放置标签的好方法是使用
标签
打印样式。但是,在实际打印区域之外放置标签存在一些困难,因为这些点和标签通常会被剪裁

由于您使用的是
stats
来修复x和Y范围,因此我将这样做:

  • 使用例如
    Set rmargin 20
    设置固定的右边距。这将使用20个字符宽度的右边距。您也可以使用绝对坐标,如
    在屏幕0.8设置rmargin
    ,但由于您需要边距来放置标签,字符单位似乎是合适的

  • 使用打印区域的右上角作为参考点
    (STATS\u max\u x,STATS\u max\u y)
    并使用
    offset
    参数移动标签,然后再次移动一些字符宽度

因此,完整的脚本可能如下所示:

# calculate the number of points
stats 'file.txt' using 1:2 nooutput

# if you want to have a fixed range for all plots
set xrange [STATS_min_x:STATS_max_x]
set yrange [STATS_min_y:STATS_max_y]

set terminal pngcairo size 800,400
outtmpl = 'output%07d.png'

v_label(x, y) = sprintf('vx = %.2f  vy = %.2f', x, y)
c_label(x, y) = sprintf('x = %d  y = %d', x, y)
t_label(t) = sprintf('t = %.2f', t)

set rmargin 20

do for [i=0:STATS_records-1] {
    set output sprintf(outtmpl, i)
    plot 'file.txt' every ::::i with lines title sprintf('n = %d', i),\
         '' every ::i::i using (STATS_max_x):(STATS_max_y):(t_label($3)) with labels offset char 11,-5 notitle,\
         '' every ::i::i using (STATS_max_x):(STATS_max_y):(c_label($1, $2)) with labels offset char 11,-6.5 notitle,\
         '' every ::i::i using (STATS_max_x):(STATS_max_y):(v_label($4, $5)) with labels offset char 11,-8 notitle
}

set output

请注意,
rmargin
offset
设置取决于终端、终端大小、字体和字体大小。对于更好的标签放置,您可以考虑分别放置<代码> Vx和VIE标签,并可以更改它们的对齐方式。 或者,在每次迭代中,您可以从数据文件中提取当前行并手动设置标签。但是,这需要使用外部工具来提取线:

do for [i=0:STATS_records-1] {
    line = system(sprintf("sed -n %dp file.txt", i+2))
    set label 1 at screen 0.9, screen 0.9 sprintf("t = %.2f", real(word(line, 3)))
    set label 2 at screen 0.9, screen 0.88 sprintf("x = %.2f y = %.2f", real(word(line, 1)), real(word(line, 2)))
    plot 'file.txt' every ::::i with lines title sprintf('n = %d', i)
}

我不知道哪种变体更适合你。我使用
I+2
作为行号来跳过已注释的标题行,这不会自动检测到。使用标签标签(
设置标签1
)可以确保旧标签被覆盖。

这很奇怪。我在终端中看到“第23行:警告:跳过没有有效点的数据文件”,标签每隔一帧出现一次。此外,只有t、vx和vy标签得到更新;xy标签仅在其位于xy轴(粒子在椭圆中移动)时才会更改,因此它是(0,1),(-1,0)等。我发布的脚本可以很好地处理您显示的两行数据文件(Windows 4.6.5、Linux 4.6.0、4.6.5和5.0rc2)。你试过这种最小配置吗?哦,我用了整个程序,大约2000行。我用两个数据行进行了尝试,效果很好。现在,您可以开始查看在脚本中所做的更改,看看哪里出了问题。特别是:你改变了画布的大小和字体(名称或大小)?我也没有改变。我所搞砸的只是输出文件的位置(我把它放在一个文件夹中)。通过在第12行中使用“c_标签(x,y)=sprintf('x=%.2fy=%.2f',x,y)”,我成功地修复了关于XY坐标的部分。我想提到的是,XY坐标标签出现在所有帧中,但T和VX-VY标签每隔一帧出现一次。
do for [i=0:STATS_records-1] {
    line = system(sprintf("sed -n %dp file.txt", i+2))
    set label 1 at screen 0.9, screen 0.9 sprintf("t = %.2f", real(word(line, 3)))
    set label 2 at screen 0.9, screen 0.88 sprintf("x = %.2f y = %.2f", real(word(line, 1)), real(word(line, 2)))
    plot 'file.txt' every ::::i with lines title sprintf('n = %d', i)
}