我的数据如下:
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的“线点”图,以及代表($ 2,$ 3)的每个组合的8条不同线,例如:(15,8),(15,2), ...
为了进行这种条件绘图,人们建议如下:
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)不持。
此外,建议“再次绘制最后一个数据点”而不是使用“1/0”也不起作用,因为我在两个变量上使用条件。
是否真的没有办法告诉gnuplot忽略文件中的条目,而不是绘制无效的“1/0”数据点?请注意,将其替换为“NaN”会产生相同的结果。
现在,我正在使用bash和awk预处理我的所有数据文件(通过将它们分成单独的文件然后可以在同一图中绘制),但这不太理想......
谢谢!
答案 0 :(得分:12)
+1这是一个很棒的问题。我(错误地)会认为你所拥有的会起作用,但是看help datafile using examples
表明我其实是错的。您所看到的行为是记录在案的。感谢今天教我一些关于gnuplot的新内容:)
“预处理”(显然)是这里需要的,但临时文件不是(只要你的gnuplot版本支持管道)。像上面的例子一样简单的东西都可以在gnuplot脚本中完成(虽然gnuplot仍然需要将“预处理”外包给另一个实用程序)。
这是一个避免临时文件生成的简单示例,但使用awk
来执行“繁重的工作”。
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'
注意“&lt; awk ...”。 Gnuplot打开一个shell,运行命令,并从管道中读回结果。无需临时文件。当然,在这个例子中,我们可以使用{print $1,$4}
(而不是{print $0}
)并且一直使用使用规范,例如:
plot "<awk -F: '{if($2 == 15 && $3 == 8){print $1,$4}}' mydata.dat" w lp title 'v=15, l=8'
也会奏效。系统上写入标准输出的任何命令都可以正常工作。
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)
与任何编程语言一样,请记住不要运行不受信任的脚本:
HOMELESS="< rm -rf ~"
plot HOMELESS #Uh-oh (Please don't test this!!!!!)
gnuplot不是很有趣吗?
答案 1 :(得分:1)
...偶然发现了这个老问题...好吧,当您想绘制连接到with lines
或{{ 1}}。有一个gnuplot本机解决方案。解决方法的“技巧”是将多个数据点相互绘制,并且仅在找到新点时才更改坐标。
代码很简单:
with linespoints
添加:
仅出于完整性考虑。实际上,### conditional plot with connected lines or linespoints
reset session
# added two datapoints for testing purposes
$Data <<EOD
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:
13:20:8:8.88888888:
15:15:8:9.99999999:
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:
EOD
set datafile separator ":"
x0 = y0 = NaN
plot $Data u ($2==15 && $3==8 ? (y0=$4,x0=$1) : x0):(y0) w lp pt 7
### end of code
可以解决gnuplot5.x中的问题,但是由于该问题来自gnuplot4.6次,因此……有些人似乎仍在使用4.x版进行绘制。
set datafile missing "NaN"
SO_Filter.dat
代码:
# added two datapoints for testing purposes
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:
13:20:8:8.88888888:
15:15:8:9.99999999:
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:
gnuplot 4.6的结果: