我有以下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
列数据和A
和D
列数据生成聚类条形图。 A
是群集号,每个群集都会重复D
。我已经设法接近我追求的最终解决方案
p "data.dat" u 5:key(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)
会给出"位置"相应群集内的那个框。结果是:
或者,另一个假设可能是每个群集具有相同数量的框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
生成其群集中特定框的位置。