gnuplot:从单个文件中绘制多行,并在列和键标题的末尾手动创建标题

时间:2015-09-16 08:16:23

标签: plot gnuplot

我对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中的建议将块拆分成几个文件?

2 个答案:

答案 0 :(得分:1)

另一个相当通用的解决方案。无需将数据拆分为多个文件。 当然,如果数据被两个空行分割成子块会更容易,但是,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

结果:

enter image description here

添加:

这是另一个允许可变子块大小的版本。 然而,标签将被放置在子块的最后数据点。 简单的“技巧”是反转数据集并通过 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

结果:

enter image description here

答案 1 :(得分:0)

您可以分两步尝试:

 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之前的点添加标签。