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