如何在 gnuplot 中使用带有“with”表示法的动态变量名称?

How can I use dynamic variable names in gnuplot with "with" notation?

提问人:sorupcikicam 提问时间:5/28/2021 更新时间:5/29/2021 访问量:399

问:

我想在带有 for 循环的 plot 命令中使用变量或数组,如下所示

style[1]= "lines lt 4 lw 2"
style[2] = "points lt 3 pt 5 ps 2"
....

title[1]= "first title"
title[2]= "second title "
...

style="'lines lt 4 lw 2' 'points lt 3 pt 5 ps 2'"
title="'first title' 'second title'"

plot 命令

plot for [i=1:1000] 'data.txt' u 1:2 title title[i] with style[i]
plot for [i=1:1000] 'data.txt' u 1:2 title word(title,i) with word(style,i)

我在标题部分取得了成功,但在 with 部分却没有。我意识到问题是由引号引起的。

i=1
plot 'data.txt' u 1:2 title "first title" with "lines lt 4 lw 2"

当我使用数组和 word 属性时,由于引号错误,我收到错误。我尝试了 sprintf,但仍然没有成功。

sprintf("with %s", style'.i.')

我希望我能正确解释。知道我如何解决这个问题吗?或者我怎样才能删除引号。非常感谢。

数组循环 Gnuplot 行情

评论

0赞 theozh 5/28/2021
欢迎来到 StackOverflow!我想你不能简单地在循环中更改绘图样式,但你可以更改线型。也许这个 stackoverflow.com/a/63699595/7295599 或这个 stackoverflow.com/a/61692635/7295599 对你有帮助。plot for
0赞 sorupcikicam 5/28/2021
谢谢@theozh。我会仔细检查您发布的链接。感谢您的回复

答:

3赞 Ethan 5/29/2021 #1

如果要选择的样式仅由线条和/或点组成,则可以通过定义相应的样式,然后按编号选择它来执行此操作。linestyle

set style line 1 lt 4 lw 2 pt 0               # lines only, no points
set style line 2 lt 3 lw 0.001 pt 5 ps 2      # points only, no lines
array Title[2] = ["style 1", "style 2"]

plot for [i=1:2] sin(x/i) with linespoints ls i title Title[i]

注意:通过将 lw 设置为正好 0 来抑制线条可能不起作用,因为许多终端将其解释为“最细的线”而不是“无线”。因此,我们将其设置为非常非常薄的东西,希望不会可见。

enter image description here

如果您要选择的样式包含线+点以外的其他内容,那么不,我认为不可能使用此技巧。

评论

0赞 sorupcikicam 5/29/2021
感谢您@Ethan的回答。可能这种方法对我有用。我了解到,我们不能轻易地在 plot 命令下返回值。
0赞 maij 5/29/2021 #2

您可以尝试将完整的 plot 命令构建为字符串,然后:eval

max_i = 2
array title[max_i]
array style[max_i]

style[1]= "lines lt 4 lw 2"
style[2] = "points lt 3 pt 5 ps 2"

title[1]= "first title"
title[2]= "second title"


cmd="plot NaN notitle"  # dummy for starting iteration
do for [i=1:max_i] {
   # append the explicit plot command
   cmd = sprintf("%s, sin(x*%d) title \"%s\" with %s", cmd, i, title[i], style[i])
}
print cmd  # just for checking the final plot command

eval cmd   # run plot command

对于 1000 行,它可能会很慢(甚至根本不起作用)。但无论如何,我会有点害怕在一张图表中有 1000 行和标题。

评论

0赞 sorupcikicam 5/29/2021
谢谢@maij。是的,这几乎正是我想要的。我猜该解决方案与 sprintfeval 有关。但是我一直无法解决它。谢谢你的回答。