【问题标题】:Gnuplot filled curves adds unwanted "bottom" borderGnuplot 填充曲线添加了不需要的“底部”边框
【发布时间】:2020-06-15 15:28:44
【问题描述】:

我正在尝试将一个图上的时间序列数据集可视化为伪 3d 图。但是,我在让填充曲线功能正常工作时遇到了一些麻烦。它似乎在我的功能的“底部”添加了一个不需要的边框,我不知道如何解决这个问题。

这是我当前的设置:我有 nb_of_frames 个不同的文件,我想在一个图形上绘制。如果没有填充曲线选项,我可以做这样的事情

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

生成如下图: 没有填充选项

我不想这样做,而是想使用填充曲线选项将我的图“向前”并突出显示我尝试使用的更“向前”的功能:

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

这会产生如下图:

这与我想要的非常接近,但似乎边框选项在我不想要的功能下方添加了一条线。我尝试了几种不同 y1 值的 with filledcurves y1=0.0 变体,但似乎没有任何效果。

任何帮助将不胜感激。感谢您的宝贵时间。

【问题讨论】:

    标签: time-series gnuplot


    【解决方案1】:

    这是 gnuplot 5.2 的另一种解决方法。

    显然,gnuplot 将填充区域从最后一个点返回到第一个点。因此,如果您指定边框,那么这条线也将有一个在这里不需要的边框(至少在@Ethan 所说的 gnuplot 5.4rc2 之前)。

    一个简单的解决方案是绘制数据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
    

    结果:

    【讨论】:

    • 谢谢@theozh!!!这很容易适应我的设置,我能够让它快速工作。感谢您和@Ethan 的帮助!
    【解决方案2】:

    我可以在 gnuplot 5.2.8 中重现这一点,但不能在 5.4 版候选发布的输出中重现。所以我认为在过去一年左右的时间里应用了一些错误修复或更改。我意识到这在您使用 5.2 版时没有帮助,但是如果您可以从源代码下载并构建 5.4 候选版本,那么可以解决它。

    更新 我想到了一种解决方法,尽管它可能太复杂而不值得。 您可以将其视为使用绘图样式 with zerrorfill 构建的 3D 围栏绘图的 2D 投影。在这个投影中,y 坐标是视觉深度。 X 是 X。z 上需要三个量:边界线、底部和顶部。 IE。 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
    

    【讨论】:

    • 嗨,伊桑,感谢您的回复。我目前使用的是 5.2 版。我似乎找到了一个“解决方法”,但我在让脚本正常工作时遇到了一些麻烦。这是“算法”: 1. 绘制第一个图所示的阶跃函数 2. 为第一个文件添加白色填充曲线(最顶部的函数) 3. 手动添加边框 4. 对其余文件重复这非常混乱而且以某种方式进入循环会很好。我不知道如何在 plot for [I:nb_of_frames] etc 中执行多个命令。
    • 因为这里的顺序很重要,如果我能做类似 ``` plot "bath.plt" u ($1):($2 * 50.0) w l lt rgb "black" lw 2 notitle, \ for [i=1:nb_of_frames] 文件名(i) u ($1):(50. * $2 + (11. - (i-1)*time_step)) w 填充曲线 y1=7。 fs solid 1.0 边框 lc "black" notitle, filename(i) u ($1):(50. * $2 + (11. - (i-1)*time_step)) w l lt rgb "black" lw 1.2 notitle ```其中 for 循环执行两个命令。
    • 我找到了 gnuplot 5.2 的解决方法(使用 5.2.8 测试)。查看更新的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2017-12-25
    相关资源
    最近更新 更多