【问题标题】:Display a column value in label with gnuplot使用 gnuplot 在标签中显示列值
【发布时间】:2021-01-16 09:49:41
【问题描述】:

我有一个程序可以生成一个包含盒子中粒子位置的文件,并且数据还包含盒子内的压力(假设每秒)。使用 gnuplot 我在循环中为粒子设置动画,但我想在标签中显示压力。有可能吗?

这是文件。压力在第 4 列

我的代码:

# Titre du graphique
set title "Mouvement de particules d'Hélium (R = 3e-2 {/Helvetica=10 \305) \n sur une surface de      4 {/Helvetica=10 \305^{2}}"
set xlabel "L {/Helvetica=10 (\305)}"
set ylabel "L {/Helvetica=10 (\305)}"
set style line 2 lc rgb 'blue' pt 7 # cercle
set style fill solid 0.4
unset key
set size square
infile = 'particules.dat'
#stats infile using 1:2 name 'data' nooutput
k=21
do for [i=0:k] {
labels(x,y) = stringcolumn(3)
stats [*:*] infile using 5 name 'pression' nooutput
set label 1 sprintf("Pression : ", pression) at screen 0.2,0.9
plot infile index i using 1:2 with circles ls 2
pause 1.0
}

【问题讨论】:

  • 欢迎您!请以文本形式提供您的示例数据。

标签: animation label gnuplot particles


【解决方案1】:

正如@Tom Solid 最初建议的那样,您仍然可以通过绘制with labels 来做到这一点。 “诀窍”是使用offset。这将给出一个标签,例如1.2 字符大小向上的偏移量。显然,有了这个,标签甚至被放置在图形区域之外。检查help label 和选项offset,它也适用于绘图样式with labels,尽管文档中没有明确提及(参见help labels)。 此外,如果您将标签限制为一行,即every ::0::0,则可以避免将多个标签打印在彼此的顶部,请查看help every

如果您想要一个动画 GIF 文件,可以使用带有选项 animateterminal gif,但不幸的是,图像质量不是那么好。我建议创建单独的 PNG 帧,例如与term pngcairo 一起使用其他软件将它们组合成动画GIF。

代码:

### animation with label from data
reset session

# create some random test data
set print $Data
do for [p=0:10] {
    do for [i=1:50] {
        print sprintf("%.3f %.3f %.2f %.2f",rand(0)*2-1,rand(0)*2-1,0.03,p/10.)
    }
    print "\n"; print "\n"
}
set print

set size ratio -1
set xrange [-1:1]
set yrange [-1:1]
unset key
set style fill transparent solid 0.3
set title "Mouvement de particules d'Hélium (R = 3e-2 Å)\nsur une surface de 4 Å^2"
myLabel(col) = sprintf("Pression: %.2f",column(col))

do for [p=0:10] {
    plot $Data u 1:2:3 index p w circles ls 1, \
         ''    u (-1):(1):(myLabel(4)) index p every ::0::0 w labels offset 0,1.2
    pause 1.0
}

# additionally create an animated GIF file
set term gif size 400,400 animate delay 100 font ",10"
set output "myHeAtoms.gif"
do for [p=0:10] {
    plot $Data u 1:2:3 index p w circles ls 1, \
         ''    u (-1):(1):(myLabel(4)) index p every ::0::0 w labels offset 0,1.2
}
set output
### end of code

结果 1:(来自 wxt 终端的单个 PNG 输出)

结果 2: 动画 GIF(好吧,图像质量不错,我不知道为什么这些点的大小明显略有不同):

【讨论】:

    【解决方案2】:

    不是那么优雅,但您可以使用多图。使用它作为循环的核心:

    set multiplot
    
    set size 1,1
    set origin 0,0
    
    set border
    set xtics; set ytics
    
    set xlabel "L {/Helvetica=10 (\305)}"
    set ylabel "L {/Helvetica=10 (\305)}"
    set title "Mouvement de particules d'Hélium (R = 3e-2 {/Helvetica=10 \305) \n sur une surface de      4 {/Helvetica=10 \305^{2}}"
    
    plot infile index i using 1:2 with circles ls 2
    
    set border 0
    unset xtics; unset ytics
    unset xlabel; unset ylabel
    unset title
    
    set origin -0.35,0.395
    plot infile index i u (0):(0):4 w labels
    
    unset multiplot
    

    您可能不得不使用当前的origin 值。

    【讨论】:

    • 你测试过你的代码吗?如果您尝试在绘图范围之外绘制with labels,则 gnuplot 会相应地调整范围(那么它将不再超出范围)或者如果您修复了范围,例如set xrange[-1:1]; set yrange[-1:1] 然后它不会被绘制,因为它在外面。我猜你会不知何故需要一些额外的设置。
    • 非常感谢汤姆。我对“压力”标签有疑问。它出现两次,分别位于图表的顶部和中间。您是如何解决这个问题的?
    • 抱歉,我无法重现该问题 :( 也许您应该将 set label 1... 放在循环之外。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2014-06-02
    相关资源
    最近更新 更多