gnuplot可以拆分数据吗?

时间:2011-09-22 22:19:48

标签: gnuplot

我有以下格式的数据:

10.0 1 a 2
10.2 2 b 2
10.4 3 a 2
10.6 4 b 2
10.8 4 c 10
11.0 4 c 20

...其中第三列基本上表示属于“独立”数据集;所以我想用红色表示那些属于'a'的样本,用蓝色等属于'b'的那些样本(使用gnuplot版本4.4补丁级别2)。

我设法以'impulses'和'point'样式混合使用'样本'样式;并通过Choosing line type and color in Gnuplot 4.0设法使用单独的颜色 - 这是我得到的距离(basictest.gnuplot):

#!/usr/bin/env gnuplot

print "Generating data..."

# to specify data inline in script:
# only system can work, as it is quoted;
# but still have to escape newlines!

system "cat > ./inline.dat <<EOF\n\
10.0 1 a 2\n\
10.2 2 b 2\n\
10.4 3 a 2\n\
10.6 4 b 2\n\
10.8 4 c 10\n\
11.0 4 c 20\n\
EOF\n"

print "done generating."


# set ranges
set yrange [0:30]
set xrange [0:4]

# define line styles - can call them up later
set style line 1 linetype 1 linewidth 3 pointtype 3 linecolor rgb "red"
set style line 2 linetype 1 linewidth 2 pointtype 3 linecolor rgb "green"
set style line 3 linetype 1 linewidth 2 pointtype 3 linecolor rgb "blue"


# offset the X axis: instead of 1:2, use: ($1-10):2
# to "mix", use "" for last datset - but must also repeat the "using"!
# ... and plot:

plot 'inline.dat' using ($1-10):2 with impulses linestyle 1,\
     "" using ($1-10):2 notitle with points linestyle 1,\
     "" using ($1-10):2 notitle with lines linestyle 2,\
     'inline.dat' using ($1-10):4 with impulses linestyle 3,\
     "" using ($1-10):4 notitle with points linestyle 3

# below just for saving file
#set terminal png
#set output 'basictest.png'
#replot

......看起来像这样:

basictest.png

换句话说,代替上述 - 代表($ 1-10):2,我希望看到1 st 和3 rd 样本( 'a')蓝色,2 nd 和4 th 样品('b')为红色,最后两个('c')为绿色(我离开绿线只是为了看风格混合效果

我知道这可以通过编写一个脚本来实现,该脚本将解析原始数据,并生成三个表格,如:

10.0 1 a 2
10.4 3 a 2
---
10.2 2 b 2
10.6 4 b 2
---
10.8 4 c 10
11.0 4 c 20

...然后可以“单独”绘制 - 但是如果gnuplot可能有类似内容的内部设施,我会徘徊?

提前感谢您的回答,
干杯!

PS:一些有用的链接:

编辑:只是想发布一个link to a script,我正在接近以我想要的方式可视化数据:

basic-labels.png

我有点想将标签(添加'点'作为rectagle背景)视为graphvizTikZ中的节点,并设置它们它们之间很好的连接线 - 但即使这已经对我有所帮助:)请注意,这是wxt输出 - 其他终端如pngpdfcairo将完全混乱的盒子渲染/标签(并且需要手动调整)。

2 个答案:

答案 0 :(得分:3)

您可以使用 awk 。我不知道我是否会称之为gnuplot的“内部设施”,但我认为它可以做你想做的事情:

使用数据文件Data.csv:

10.0 1 a 2
10.2 2 b 2
10.4 3 a 2
10.6 4 b 2
10.8 4 c 10
11.0 4 c 20

使用

绘制数据
plot "<awk '{if($3 == \"a\") print $1,$2}' Data.csv" u ($1 - 10):2 w lp, \
     "<awk '{if($3 == \"b\") print $1,$2}' Data.csv" u ($1 - 10):2 w lp, \
     "<awk '{if($3 == \"c\") print $1,$2}' Data.csv" u ($1 - 10):2 w lp

注意\"转义脚本解析器^^ 至于情节风格问题,你可以利用gnuplot提供的全频谱。

答案 1 :(得分:2)

有可能。 Gnuplot有一个像C一样的三元运算符.Gnuplot也会忽略未定义的表达式,例如负数的对数或除以零。将它们组合在一起,您可以通过为不满足条件的那些生成无效数字来仅绘制满足某些特定条件的那些行。从问题中简化一下,方法如下:

plot "inline.dat" using (strcol(3) eq 'a' ? $1 : 1/0):2