0

我试图弄清楚如何在 gnuplot 中绘制围栏图,但我很难理解我在互联网上找到的示例中发生了什么。

在我的模拟中,我有来自不同时间点的(不同)数量的数据集,在一个数据文件中,该数据文件组织为值矩阵1

t1    x11    y11   // indices here indicate that (x1,y1) are a data point which
t1    x21    y21   // I'd plot on a regular 2D plot for this timestep, with the
...                // additional index noting which time step the values are for.
t1    xN1    yN1   
[blank line]
t2    x12    y12
t2    x22    y22
...
t2    xN2    yN2
[etc...]
tM    xNM    yNM

我想为每个时间值绘制一个围栏。我可以简单地绘制splot 'data.txt'并得到与我想要的非常相似的东西 -+沿着栅栏的“顶部边缘”的标记,x 轴上的时间,y 轴上的 x 数据和 z 轴上的 y 数据。w lines但是,如果我在命令中添加类似的东西,splot我只会得到一个连接了所有数据系列的表面。

我试图调整演示脚本集合中的示例(大约一半),但它们都依赖于一个虚拟变量,我不知道如何将它与我的数据系列结合起来。我也找到了一些其他的例子,但它们都非常复杂,我根本不明白它们在做什么。

使用 gnuplot 从数据创建围栏图的好方法是什么?


1如果有必要,可以改变它——我控制着生成数据的代码。虽然很麻烦...

4

1 回答 1

3

不幸的是,这确实需要对数据进行一些更改。虽然变化很小,但可能可以用一个简单的awk1,2脚本来处理:

这是我的交互式 gnuplot 会话的复制/粘贴:

gnuplot> !cat test.dat
1 2 3
1 2 0

1 3 4
1 3 0

1 4 5
1 4 0


2 2 3
2 2 0

2 3 4
2 3 0

2 4 5
2 4 0


3 2 3
3 2 0

3 3 4
3 3 0

3 4 5
3 4 0
!
gnuplot> splot 'test.dat' u 1:2:3 w lines

这里要注意的是,“栅栏”之间有 2 个空行,每个 x,y 数据点出现两次,之后有一个空行。第二次出现时,z 坐标为 0。

要使每个栅栏具有不同的颜色:

gnuplot> splot for [i=0:3] 'test.dat' index i u 1:2:3 w lines

awk 脚本甚至可以内联完成:

splot "< awk {...} datafile"

但这可能会在引用时变得有点棘手(要在单引号字符串中包含单引号,请将其加倍)......

AWKCMD='awk ''{if(!NF){print ""}else if(index($0,"#")!=1){printf "%s %s %s\n%s %s 0\n\n", $1,$2,$3,$1,$2}}'' '
splot '<'.AWKCMD.'datafile.dat' u 1:2:3 w lines

就效率而言,我相信我上面使用的迭代每次迭代都会调用 awk 命令。这里的解决方法是从索引号中提取颜色:

splot '<'.AWKCMD.' test.dat' u 1:2:3:(column(-2)) w l lc variable

我相信这只会awk根据需要执行一次命令,因此只有一百万个条目,它仍然应该相对快速地响应。


1awk '{if(!NF){print ""}else{printf "%s %s %s\n%s %s 0\n\n", $1,$2,$3,$1,$2}}' test.dat

2awk '{if(!NF){print ""}else if(index($0,"#")!=1){printf "%s %s %s\n%s %s 0\n\n", $1,$2,$3,$1,$2}}' test.dat(忽略评论的版本)

于 2013-04-16T12:09:16.037 回答