【问题标题】:Plotting from line to line with gnuplot使用gnuplot逐行绘制
【发布时间】:2021-02-06 11:43:52
【问题描述】:

我有一个 .txt 文件,其中两组数据在同一列中,但被一些字符分开,这里是一个例子:

#第一组数据
#时间 #速度
1 0.3
2 0.5
3 0.8
4 1.3

#第二组数据
#时间 #速度
1 0.7
2 0.9
3 1.8
4 2.3

所以我想将这两组数据绘制为两条不同的曲线,而且我不知道每组数据有多少行(或者至少这个数字可以改变)所以我不能使用每个命令。(我正在寻找一些 gnuplot 命令,而不是 bash 命令)。 谢谢

【问题讨论】:

    标签: database csv plot gnuplot txt


    【解决方案1】:

    正如您已经提到的,every 在这里不起作用,因为您有可变长度的数据集编辑:是的,它会,请参阅下面的编辑)。 如果您有两个空行来分隔您可以使用索引的数据集,请检查help index。 但是,如果您有一个空行,pseudocolumn -1 会有所帮助。检查help pseudocolumns。 然后你可以用三元运算符定义一个过滤器,检查help ternary

    代码:

    ### plotting variable datasets
    reset session
    
    $Data <<EOD
    #First set of data
    #Time        #Velocity
    1              0.3
    2              0.5
    3              0.8
    4              1.3
    
    #Second set of data
    #Time        #Velocity
    1              0.7
    2              0.9
    3              1.8
    
    #Third set of data
    #Time        #Velocity
    1              0.9
    2              1.4
    3              2.6
    4              3.6
    5              4.8
    EOD
    
    myFilter(col,i) = column(-1)==i-1 ? column(col) : NaN
    
    set key top left
    plot for [i=1:3] $Data u 1:(myFilter(2,i)) w lp pt 7 title sprintf("Set %d",i)
    ### end of code
    

    编辑:(正如@binzo 指出的那样)

    实际上,我把它弄得太复杂了。像下面这样简单也可以不用filter也行(其他场合也可以用filter)。请注意,块从 0 开始编号。

    plot for [i=1:3] $Data u 1:2 every :::i-1::i-1 w lp pt 7 title sprintf("Set  %d",i)
    

    结果:

    【讨论】:

    • 您可能还想看看以下没有块之间分隔的答案:stackoverflow.com/a/64423162/7295599stackoverflow.com/a/64482390/7295599
    • 在您的示例中使用 $Data 的情况下,您还可以使用 'every',如下所示。 plot for [i=0:2] $Data every :::i::i u 1:2 w lp pt 7 title sprintf("Set %d",i+1)
    • @binzo,你是绝对正确的......抱歉让事情变得比现在更复杂。您可以通过every 寻址的块(或集合或任何您称之为的块)与 OPs 问题中一样由一个空行分隔。我会添加它。
    猜你喜欢
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多