【问题标题】:gnuplot: plot multiple lines from single file and make title at end from column and key title manuallygnuplot:从单个文件中绘制多行并手动从列和键标题中制作标题
【发布时间】:2015-12-12 17:14:12
【问题描述】:

我对 gnuplot 很陌生,所以也许我的问题有一个明显的答案。如果这太菜了,请原谅。

我有以下数据

20 500 1.0
30 500 0.95
40 500 0.85
50 500 0.7
60 500 0.5

20 1000 1.1
30 1000 1.05
40 1000 0.95
50 1000 0.8
60 1000 0.6

20 1500 1.2
30 1500 1.15
40 1500 1.05
50 1500 0.9
60 1500 0.7

20 2000 1.26
30 2000 1.22
40 2000 1.13
50 2000 0.99
60 2000 0.79

20 2500 1.33
30 2500 1.29
40 2500 1.21
50 2500 1.06
60 2500 0.88

将其绘制为表面效果很好。现在我想将其绘制为 5 条单独的线(使用 1:3),并将每条线的第 2 列作为“结束标题”。

我试过了

plot "demo.dat" using 1:3:2 with lines title columnhead(2) at end

但这只会用 500 标记最后一行(这是伪造的)并忽略所有其他行。它还将 500 设置为密钥框中的标题(我想将其设置为另一个字符串)。这是可能的还是我必须按照How to plot single/multiple lines depending on values in a column with GNUPlot 中的建议将块拆分为多个文件?

【问题讨论】:

标签: plot gnuplot


【解决方案1】:

您可以分两步尝试:

 plot 'demo.dat' u 1:3 notitle with lines, \
  'demo.dat' u 1:3:2 every ::4::4 notitle with labels
  • 首先绘制数据。

  • 然后在每个块的最后一个点添加一个标签(由从 0 到 4 的 5 个点组成),或者在最后一个点之前的点添加一个标签,将::4::4 替换为::3::3

【讨论】:

    【解决方案2】:

    另一个相当通用的解决方案。无需将数据拆分为多个文件。 当然,如果数据被两个空行分割成子块会更容易,但是,OP的数据只被单个空行分隔。如何在不修改 gnuplot 之外的数据的情况下处理这个问题?

    对于以下解决方案,您不必提前知道您的数据有多少个子块以及一个子块中有多少个数据点,因为在第一次绘图之后,变量 c 包含数据点的数量(这里是 25 ) 除以子块数(此处为 5)减 1,即子块中最后一个数据点的索引(此处为 4)。假设:每个子块具有相同数量的数据点。

    此外:

    • 子块的不同颜色
    • 第 2 列的值作为末尾的标签
    • 图例/键中的一些其他文本

    如果您将 reset session 替换为 reset 并删除数据块 $Data <<EOD ... EOD 并在绘图命令中将 $Data 替换为您的文件名,这甚至适用于 gnuplot 4.6,例如'myFile.dat'.

    代码:

    ### plotting some subblock data
    reset session
    
    $Data <<EOD
    20 500 1.0
    30 500 0.95
    40 500 0.85
    50 500 0.7
    60 500 0.5
    
    20 1000 1.1
    30 1000 1.05
    40 1000 0.95
    50 1000 0.8
    60 1000 0.6
    
    20 1500 1.2
    30 1500 1.15
    40 1500 1.05
    50 1500 0.9
    60 1500 0.7
    
    20 2000 1.26
    30 2000 1.22
    40 2000 1.13
    50 2000 0.99
    60 2000 0.79
    
    20 2500 1.33
    30 2500 1.29
    40 2500 1.21
    50 2500 1.06
    60 2500 0.88
    EOD
    
    set rmargin 7
    set key at graph 0.95, 0.95 reverse
    
    plot $Data u 1:3:(c=int(($0+1)/(column(-1)+1))-1,column(-1)) w lp pt 7 lc var notitle, \
         ''    u 1:3:2 every ::c::c w labels offset 3,0 \
               title "This is some other text\nfor the legend"
    ### end of code
    

    结果:

    加法:

    这是另一个允许可变子块大小的版本。 然而,标签将放置在子块的 last 数据点。 简单的“技巧”是反转数据集并通过every ::0:0:0:0将标签放在每个子块的第一个数据点。 此外,单个空行将被双空行替换,因此子块可以由index 寻址。为了便于说明,对原始数据稍作修改。

    为了反转数据集,它需要位于数据块中(请参阅gnuplot: load datafile 1:1 into datablock

    代码:(需要 gnuplot >=5.2)

    ### plot subblocks variable in length separated by only one empty line
    # and put labels at *last* values
    # requires gnuplot >=5.2
    reset session
    
    $Data <<EOD
    10 500 1.05
    20 500 1.0
    30 500 0.95
    40 500 0.85
    50 500 0.7
    60 500 0.5
    
    20 1000 1.1
    30 1000 1.05
    40 1000 0.95
    50 1000 0.8
    
    20 1500 1.2
    30 1500 1.15
    40 1500 1.05
    50 1500 0.9
    60 1500 0.7
    70 1500 0.51
    80 1500 0.30
    
    20 2000 1.26
    30 2000 1.22
    40 2000 1.13
    50 2000 0.99
    60 2000 0.79
    70 2500 0.61
    
    20 2500 1.33
    30 2500 1.29
    40 2500 1.21
    50 2500 1.06
    60 2500 0.88
    EOD
    
    # reverse data
    set print $DataReversed
        do for [i=|$Data|:1:-1] { 
            if (strlen($Data[i])==1) {print ""}
            print $Data[i]
        }
    set print
    print $DataReversed
    
    set rmargin 7
    set yrange [0.2:]
    
    plot $DataReversed u 1:3:(LastIdx=column(-2),$2) every ::0:0:0:0 w labels offset 3,0 notitle, \
         for [i=0:LastIdx] '' u 1:3 index LastIdx-i w lp pt 7 lc i ti sprintf("Subblock %d",i)
    ### end of code
    

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多