谁能告诉我如何在 Gnuplot 中绘制这样的图形?我分为三个类别:
A
、B
和 C
。每个类别中我有三个子类别:SR1
、SR0.8
和SR0.5
。对于每个 SR1
、SR 0.8
和 SR0.5
,我有两个变量:SR1_L
和 SR1_R
。我想在一个栏中绘制 SR1_L
和 SR1_R
,如图所示。对于 SR1_L
,用纯色填充,SR1_R
用斜线填充。 SR1
、SR0.8
和 SR0.5
之间没有空格,但类别 A
、B
和 C
之间有空格。
我很感谢你帮助我弄清楚如何绘制这样的图形。我目前对此没有解决方案。
这个图是从其他软件生成的,我也不知道如何在txt文件中输入数据。不过,我上传原始数据是为了一些说明。 原始数据如下:
Category A:
SR1_L: 0.5 SR1_R:0.5
SR0.8_L: 0.6 SR0.8_R:0.4
SR0.5_L: 0.7 SR0.5_R:0.3
Category B:
SR1_L: 0.5 SR1_R:0.5
SR0.8_L: 0.6 SR0.8_R:0.4
SR0.5_L: 0.7 SR0.5_R:0.3
Category C:
SR1_L: 0.5 SR1_R:0.5
SR0.8_L: 0.6 SR0.8_R:0.4
这个问题让我想起了这个问题:如何在 gnuplot 中创建行堆叠和集群条形图?,但不知何故有点不同。
也许有一种方法可以使用一些 gnuplot 固有的绘图风格,但我会从一个平面列表开始。 这是一个足够通用的建议,可以适用于不同数量的类别、子类别和子子类别(例如“L”、“R”、“M”、“K”……)。
一些评论:
通过(错误)使用
stats
命令自动创建类别的唯一项目列表。顺序按照第一次出现的顺序。 (检查help stats
)
如果您的数据位于数组中,则更容易求和。再次(错误)使用
stats
命令将文件中的数据获取到数组中。 (检查help arrays
)
使用绘图样式
with boxxyerror
提供最高的灵活性(检查help boxxyerror
)
keyentry
用于创建图例(选中 help keyentry
)
我故意更改了您的原始数据,以查看类别之间存在差异。
数据:
SO78325960.dat
A SR1 L 0.5
A SR1 R 0.5
A SR0.8 L 0.6
A SR0.8 R 0.4
A SR0.5 L 0.7
A SR0.5 R 0.3
B SR1 L 0.52
B SR1 R 0.52
B SR0.8 L 0.64
B SR0.8 R 0.44
B SR0.5 L 0.78
B SR0.5 R 0.38
C SR1 L 0.5
C SR1 R 0.5
C SR0.8 L 0.4
C SR0.8 R 0.4
脚本:
### plot special barchart
reset session
FILE = "SO78325960.dat"
c0 = 1 # columns for L0,L1,L2
c1 = 2
c2 = 3
c3 = 4 # column for y-data
L0 = L1 = L2 = ''
addToList(list,col) = (_s=sprintf(' "%s"',strcol(col)), strstrt(list,_s) ? '' : _s)
stats FILE u (L0=L0.addToList(L0,c0), L1=L1.addToList(L1,c1), L2=L2.addToList(L2,c2)) nooutput
N0 = words(L0)
N1 = words(L1)
N2 = words(L2)
Ngap = 1
myBoxwidth = 0.8
PosX0(c0) = c0*(N1+Ngap) + (N1-1)/2.
PosX1(c0,c1) = c0*(N1+Ngap) + c1
myPattern(n) = word("3 6 2 7", n)
Filter(n0,n1,n2) = strcol(c0) eq word(L0,n0+1) && strcol(c1) eq word(L1,n1+1) && strcol(c2) eq word(L2,n2)
array A[N0*N1*N2]
set table $Dummy
plot for [n0=0:N0-1] for [n1=0:N1-1] for [n2=1:N2] FILE \
u ($0==0 ? (i=n0*N1*N2+n1*N2+n2, A[i]=0) : 0, Filter(n0,n1,n2) ? A[i]=column(c3) : 0) w table
unset table
undef $Dummy
set offsets 0.5,0.5, graph 0.05,0
set yrange[0:]
set xtics out
set style fill solid 0.3
set key out noautotitle noenhanced
set for [i=0:N0-1] xtic (word(L0,i+1) PosX0(i))
set xrange[-0.5:]
plot for [n0=0:N0-1] for [n1=0:N1-1] for [n2=1:N2] '+' every ::::0 \
u (PosX1(n0,n1)):(y0=A[n0*N1*N2+n1*N2+n2]/2. + sum[i=1:n2-1] A[n0*N1*N2+n1*N2+i]): \
(myBoxwidth/2.):(A[n0*N1*N2+n1*N2+n2]/2.) w boxxy lc n1+1 fill pattern myPattern(n2), \
for [n1=1:N1] for [n2=1:N2] keyentry w boxes lc n1 fill pattern myPattern(n2) ti sprintf("%s_%s",word(L1,n1), word(L2,n2))
### end of script
结果: