如何使用 gnuplot 绘制这样的直方图

问题描述 投票:0回答:1

谁能告诉我如何在 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
1个回答
0
投票

这个问题让我想起了这个问题:如何在 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

结果:

© www.soinside.com 2019 - 2024. All rights reserved.