集群条形图

时间:2017-04-18 14:49:00

标签: gnuplot

我有以下data.dat文件

A  B  C D    E 
1 24 24 1 5.06326e-05
1 12 12 2 9.82645e-05
1  6  6 4 0.000178653
1  3  3 8 0.000326006
2 48 24 1 2.92298e-05
2 24 12 2 6.06926e-05
2 12  6 4 0.000102249
2  6  3 8 0.000184589

我希望使用E列数据和AD列数据生成聚类条形图。 A是群集号,每个群集都会重复D。我已经设法接近我追求的最终解决方案

p "data.dat" u 5:key(1)

获得 enter image description here

然而,虽然数据是正确的,但群集并不常见。有没有一种方法可以在不改变数据格式的情况下使用群集来绘制它?

1 个答案:

答案 0 :(得分:1)

我想说这也取决于你想要处理的一般输入。如果列D始终包含每个群集的连续幂2,则可能会尝试使用boxes绘图样式手动构造框:

set terminal pngcairo enhanced
set output 'fig.png'

#if your data file contains the header line with A, B, C, D, E
set key autotitle columnhead

set boxwidth 0.5
set style fill solid

f=6
w=0.5

unset key
set style fill empty

unset xtics
set ytics out nomirror

set format y '%.2f'
set label at graph 0,1 "{/Symbol \264}10^{3}" offset character 0.75,-1
plot \
    'data.dat' u ($1*f*w + log($4)/log(2)*w):($5/1e-3) w boxes lc rgb 'dark-red', \
    '' u ($1*f*w + log($4)/log(2)*w):(0):4 w labels offset 0, char 1

这里,变量w指定了基本框的所需。每个框的位置计算为整个群集$1*f*w的偏移量加上特定框log($4)/log(2)*w的偏移量。如果列D包含数字1,2,4,8等,则log($4)/log(2)会给出"位置"相应群集内的那个框。结果是: enter image description here

或者,另一个假设可能是每个群集具有相同数量的框G。然后脚本可能看起来像:

set terminal pngcairo enhanced
set output 'fig.png'

#if your data file contains the header line with A, B, C, D, E
set key autotitle columnhead

set boxwidth 0.5
set style fill solid

f=6
w=0.5
G=4

unset key
set style fill empty

unset xtics
set ytics out nomirror

set format y '%.2f'
set label at graph 0,1 "{/Symbol \264}10^{3}" offset character 0.75,-1
plot \
    'data.dat' u (int($0/G)*f*w + (int($0)%G)*w):($5/1e-3) w boxes lc rgb 'dark-red', \
    '' u (int($0/G)*f*w + (int($0)%G)*w):(0):4 w labels offset 0, char 1

使用特殊列号int($0/G)计算簇号为0(在输入数据文件中给出基于0的行号)。以类似的方式int($0)%G生成其群集中特定框的位置。