本文介绍了Gnuplot:使用线条进行条件绘图($ 2 == 15?$ 2:'1/0')的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的数据如下:


10:15:8:6.06000000:
10:15:2:19.03400000:
10:20:8:63.50600000:
10:20:2:24.71800000:
10:25:8:33.26200000:
10:30:8:508.23400000:
20:15:8:60.06300000:
20:15:2:278.63100000:
20:20:8:561.18000000:
20:20:2:215.46600000:
20:25:8:793.36000000:
20:25:2:2347.52900000:
20:30:8:5124.98700000:
20:30:2:447.41000000:
(...)

我想在x轴上绘制一个线点图,其中$ 1,代表8条不同的线($ 2,$ 3)的每个组合,例如:(15,8),(15,2),...

I'd like to plot a "linespoints" plot with $1 on the x-axis, and 8 different lines representing each combination of ($2,$3), e.g.: (15,8), (15,2), ...

为了进行这种条件绘图,人们提出以下建议:

In order to do this sort of conditional plotting, people suggest the following:

plot 'mydata.dat'  using 1:($2==15 && $3==8 ? $4 : 1/0) with  linespoints 'v=15, l=8'

,gnuplot无法通过这些点画一条线,因为​​ 1/0是无效的,并且已插入以替换其( $ 2 == 15&& $ 3 == 8)不成立。

However, gnuplot is unable to draw a line through these points, as "1/0" is invalid and inserted to replace each data point for which ($2==15 && $3==8) doesn't hold.

此外,建议再次绘制最后一个数据点而不是使用 1/0工作,因为我在两个变量上使用了条件。

Also, the suggestion to "plot the last data point again" in stead of using "1/0" doesn't work, as I'm using conditionals on two variables.

真的没有办法告诉gnuplot忽略文件中的条目,而不是绘制无效的 1/0数据点?请注意,将其替换为 NaN会得到相同的结果。

Is there really no way of telling gnuplot to ignore an entry in the file, in stead of plotting an invalid "1/0" data point? Note that replacing it by "NaN" yields the same result.

现在,我正在预处理所有数据文件(将它们拆分为单独的文件,然后可以在同一图中绘制)使用bash和awk,但这并不理想...

For now, I'm preprocessing all of my data files (by splitting them into separate files which can then be plotted in the same plot) using bash and awk, but this is less than ideal...

谢谢!

推荐答案

+1提出了一个很好的问题。我(错误地)以为您可以使用,但是使用示例查看 help数据文件显示我实际上是错误的。您所看到的行为已记录在案。感谢您今天教我一些有关gnuplot的新知识:)

+1 for a great question. I (mistakenly) would have thought that what you had would work, but looking at help datafile using examples shows that I was in fact wrong. The behavior you're seeing is as documented. Thanks for teaching me something new about gnuplot today :)

(显然)预处理是这里所需要的,但是不需要临时文件(只要您的版本是gnuplot支持管道。像您上面的示例一样简单的操作都可以在gnuplot脚本中完成(尽管gnuplot仍需要将预处理外包给另一个实用程序)。

"preprocessing" is (apparently) what is needed here, but temporary files are not (as long as your version of gnuplot supports pipes). Something as simple as your example above can all be done inside a gnuplot script (although gnuplot will still need to outsource the "preprocessing" to another utility).

这样的示例将避免生成临时文件,但使用 awk 进行繁重的工作。

Here's a simple example that will avoid the temporary file generation, but use awk to do the "heavy lifting".

set datafile sep ':'  #split lines on ':'
plot "<awk -F: '{if($2 == 15 && $3 == 8){print $0}}' mydata.dat" u 1:4 w lp title 'v=15, l=8'

请注意< awk ...。 Gnuplot打开外壳程序,运行命令,然后从管道读取结果。无需临时文件。当然,在此示例中,我们可以使用 {print $ 1,$ 4} (而不是 {print $ 0} )并一起放弃了使用规范,例如:

Notice the "< awk ...". Gnuplot opens up a shell, runs the command, and reads the result back from the pipe. No temporary files necessary. Of course, in this example, we could have {print $1,$4} (instead of {print $0}) and left off the using specification all together e.g.:

plot "<awk -F: '{if($2 == 15 && $3 == 8){print $1,$4}}' mydata.dat" w lp title 'v=15, l=8'

也可以。系统上任何写入标准输出的命令都可以使用。

will also work. Any command on your system which writes to standard output will work.

plot "<echo 1 2" w p  #plot the point (1,2)

您甚至可以使用管道:

plot "<echo 1 2 | awk '{print $1,$2+4}'" w p #Plots the point (1,6)

与任何编程语言一样,请记住不要运行不受信任的脚本:

As with any programming language, remember not to run untrusted scripts:

HOMELESS="< rm -rf ~"
plot HOMELESS  #Uh-oh (Please don't test this!!!!!)

gnuplot很有趣吗?

Isn't gnuplot fun?

这篇关于Gnuplot:使用线条进行条件绘图($ 2 == 15?$ 2:'1/0')的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-01 23:23