Gnuplot填充曲线会增加不必要的“底部”边框。

3

我正在尝试将时间序列数据集可视化为伪3D图形。但是,我在让filledcurves功能正常工作方面遇到了一些问题。它似乎在我的函数的“底部”添加了一个不需要的边框,我不知道如何修复这个问题。

以下是我的当前设置:我有nb_of_frames个不同的文件,我想在一个图上绘制它们。如果没有filledcurves选项,我可以做出像这样的事情:

plot for [i=1:nb_of_frames] filename(i) u ($1):(50.0 * $2 + (11.0 - (i-1)*time_step)) w l linewidth 1.2 lt rgb "black" notitle

使用filledcurves选项可以使我的图形“前置”,突出更“前置”的函数。示例如下:

enter image description here

与此不同的是,我想使用filledcurves选项来展示图形,并突出显示更“前置”的函数。

plot for [i=1:nb_of_frames] filename(i) u ($1):(50. * $2 + (11. - (i-1)*time_step)) w filledcurves fc "white" fs solid 1.0 border lc "black" notitle

此命令将生成以下图形:enter image description here

这已经非常接近我想要的效果了,但似乎边框选项会在函数下方添加一条线,而我并不希望看到那条线。我尝试过几种 with filledcurves y1=0.0 的变体并尝试不同的 y1 值,但都没有起作用。

如果有任何帮助,我将不胜感激。谢谢你花时间阅读。

2个回答

2
我可以在gnuplot 5.2.8中重现这个问题,但在版本5.4的发布候选版输出中却不能。因此,我认为在过去的一年左右中应用了一些错误修复或更改。我知道这并不能帮助你在使用5.2版本时解决问题,但如果你能从源代码下载并构建5.4版本的发布候选版,那就可以解决这个问题了。

enter image description here

更新: 我想到了一个解决方法,虽然可能过于复杂而不值得。 您可以将其视为使用绘图样式with zerrorfill构建的三维围栏图的二维投影。在此投影中,y坐标是可见深度。 X是X。在z上需要三个量:边界线、底部和顶部。即using子句中的5个字段:x depth zline zbase ztop
unset key
set view 90, 180
set xyplane at 0
unset ytics

set title "3D projection into the xz plane\nplot with zerrorfill" offset 0,-2

set xlabel "X axis" offset 0,-1
set zlabel "Z"

splot for [i=1:25] 'foo.dat' using ($1+i):(i/100.):($2-i):(-i):($2-i) \
                    with zerrorfill fc "light-cyan" lc "black"  lw 2

enter image description here


嗨,伊桑,感谢您的回复。我目前使用的是5.2版本。我似乎找到了一个“解决方法”,但我在让脚本正常工作方面遇到了一些问题。这是“算法”:
  1. 绘制第一张图中看到的阶梯函数
  2. 添加第一个文件(最上面的函数)的白色填充曲线
  3. 手动添加边框
  4. 重复处理其他文件
这非常混乱,希望能以某种方式进入循环。我不知道如何在plot for [I:nb_of_frames]等中执行多个命令。
- Eric Tovar
因为顺序在这里很重要,如果我可以像这样做就太好了 plot "bath.plt" u ($1):($2 * 50.0) w l lt rgb "black" lw 2 notitle, \ for [i=1:nb_of_frames] filename(i) u ($1):(50. * $2 + (11. - (i-1)*time_step)) w filledcurves y1=7. fs solid 1.0 border lc "black" notitle, filename(i) u ($1):(50. * $2 + (11. - (i-1)*time_step)) w l lt rgb "black" lw 1.2 notitle其中for循环执行两个命令。 - Eric Tovar
我找到了gnuplot 5.2的解决方法(已在5.2.8上测试)。请参考更新后的答案。 - Ethan

2
这是gnuplot 5.2的另一个解决方法。
显然,gnuplot会将填充区域从最后一个点封闭回第一个点。因此,如果您指定边框,则此行也将具有边框,这在这里是不希望的(至少在gnuplot 5.4rc2之前是如此,正如@Ethan所说)。
一种简单的解决方案是使用with filledcurves绘制数据,不要使用边框,然后再次使用with lines。但是,由于这是一系列移位数据,因此必须交替绘制。不幸的是,gnuplot不能在for循环中切换绘图样式(至少我不知道如何做)。为了解决这个问题,您必须在先前的循环中构建绘图命令,并在绘图命令中使用宏@(请检查help macros)。希望您可以根据下面的示例调整自己的需求。 代码:
### filledcurves without bottom border
reset session
set colorsequence classic

$Data <<EOD
1  0
2  1
3  2
4  1
5  4
6  5
7  2
8  1
9  0
EOD

myData(i) = sprintf('$Data u ($1-0.1*%d):($2+%d/5.)',i,i)
myFill    = ' w filledcurves fc "0xffdddd" fs solid 1 notitle'
myLine    = ' w l lc rgb "black" notitle'

myPlotCmd = ''
do for [i=11:1:-1] {
    myPlotCmd = myPlotCmd.myData(i).myFill.", ".myData(i).myLine.", "
}

plot @myPlotCmd

### end of code

结果:

输入图像描述


这是一个显示图片的HTML代码,图片的URL链接在标签中。

谢谢@theozh!!! 这很容易适应我的设置,我能够快速让它工作。我感谢你的帮助,也感谢你的帮助@Ethan! - Eric Tovar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接