Matplotlib 在gnuplot中对特定于类别的条进行分组并提供xtics子类别

Matplotlib 在gnuplot中对特定于类别的条进行分组并提供xtics子类别,matplotlib,gnuplot,bar-chart,Matplotlib,Gnuplot,Bar Chart,我需要绘制三类数据: cat1(具有子类别i1、i2、i3) cat2(具有子类别p1、p2、p3) cat3(具有子类别n1、n2、n3) 每个类别应分组,并采用不同的颜色。在每个组中,我们需要将不同的图案分配给方框和相应的子类别,因为需要提供xtic标签以进行区分 下面是示例数据和代码。 样本数据:Sample.dat cat1 i1 95.2162 0.817947 i2 96.2065 0.710029 i3 98.4846 0.58444 cat2 p1 96.899 0.502

我需要绘制三类数据:

  • cat1(具有子类别i1、i2、i3)
  • cat2(具有子类别p1、p2、p3)
  • cat3(具有子类别n1、n2、n3)
每个类别应分组,并采用不同的颜色。在每个组中,我们需要将不同的图案分配给方框和相应的子类别,因为需要提供xtic标签以进行区分

下面是示例数据和代码。 样本数据:Sample.dat

cat1 i1 95.2162 0.817947 i2 96.2065 0.710029 i3 98.4846 0.58444 
cat2 p1 96.899 0.502756 p2 97.9695 1.16202 p3 99.631 0.0911258 
cat3 n1 99.4709 0.318714 n2 99.5897 0.234542 n3 99.9535 0.0507579
代码:

请查找图形输出。所需的输出是在一个单一的颜色和需要有特定的子类别作为xtic标签分组酒吧。但是这里的输出失败了,在所有类别中显示了3种颜色,每个组只有最后一个xtic。你能帮我理解我哪里出错了吗


多谢各位

一种可能的解决方案是使用带框的
打印样式生成单个组,然后叠加错误条。下面的脚本将boxwidth设置为1,然后按固定量(4和8)偏移各个组。由于每个组中只有3个盒子,因此在组之间提供了足够的“间隙”(与每个盒子一样宽)

在这里,第一条语句进行绘图,而第二条语句生成一个空绘图(由于未定义的值
1/0
),但使用偏移1的颜色索引,即
($0+2)
,而不是
($0+1)
。这样,图例中的项目将获得正确的颜色(蓝色而不是红色)

结果是:

最后,语句
$DATA
表示一个数据块。Gnuplot的旧版本(我猜是早于5版本)不支持此功能,因此可以使用包含数据的文件名的变量替换
$DATA

编辑2:


更具体地说,例如表达式
(4*$0+1):6:($0+1):xtic(5)
请求在x坐标处生成框,计算为行号(基于0)的4倍加1。框的高度取自第6列,颜色索引
($0+1)
计算为1加行号,最后从第5列加载xtic标签。

非常感谢您的回答!!但这里的问题是i1,i2,i3属于一个类别。类似地,p1、p2、p3属于一个类别,n1、n2、n3属于一个类别。基本上,每一行都属于不同的类别。你也能帮我编译一下吗?$当我compiling@ksn我已经更新了答案以回应您的评论。请您帮助理解这种格式(4*$0+1):(1/0):($0+3):xtic(5)这些参数x:y:z或x:yz:p的本质是什么?我也尝试过gnuplot 5.0 patchlevel 7。它无法识别颜色,线条类型也发生了变化。我试过使用gnuplot 4.6 patchlevel 6,因此它也弄乱了格式。您能告诉我您选择了哪个版本进行编译吗?@ksn最初,我是用Gnuplot 5.2(patchlevel 3)制作的。然而,我也尝试了5.0.7,结果似乎是一致的。这些颜色到底是怎么被认出来的?
set terminal png
set output 'bar.png'
set style data histograms
set style fill solid 1 border lt -1
set boxwidth 0.9
set style histogram errorbars lw 3
plot 'sample.dat' using 3:4:xtic(2) title "cat1", \
     ''             using 6:7:xtic(5) title "cat2", \
     ''             using 9:10:xtic(8) title "cat3"
$DATA <<EOD
cat1 i1 95.2162 0.817947 i2 96.2065 0.710029 i3 98.4846 0.58444 
cat2 p1 96.899 0.502756 p2 97.9695 1.16202 p3 99.631 0.0911258 
cat3 n1 99.4709 0.318714 n2 99.5897 0.234542 n3 99.9535 0.0507579
EOD

set terminal pngcairo enhanced rounded font ",16"
set output 'fig.png'

set style fill solid 1 border lt -1
set boxwidth 1.0

set linetype 42 lw 2 lc rgb 'black'
set yr [94:102]

set xtics out nomirror

plot \
  $DATA using (0 + $0):3:xtic(2) w boxes lc rgb 'red' t 'cat1', \
  $DATA using (0 + $0):3:4 w yerrorbars lt 42 t '', \
  $DATA using (4 + $0):6:xtic(5) w boxes lc rgb 'green' t 'cat2', \
  $DATA using (4 + $0):6:7 w yerrorbars lt 42 t '', \
  $DATA using (8 + $0):9:xtic(8) w boxes lc rgb 'blue' t 'cat3', \
  $DATA using (8 + $0):9:10 w yerrorbars lt 42 t ''
$DATA <<EOD
cat1 i1 95.2162 0.817947 i2 96.2065 0.710029 i3 98.4846 0.58444 
cat2 p1 96.899 0.502756 p2 97.9695 1.16202 p3 99.631 0.0911258 
cat3 n1 99.4709 0.318714 n2 99.5897 0.234542 n3 99.9535 0.0507579
EOD

set terminal pngcairo enhanced rounded font ",16"
set output 'fig.png'

set style fill solid 1 border lt -1
set boxwidth 1.0

set linetype 42 lw 2 lc rgb 'black'
set yr [94:102]

set xtics out nomirror

set lt 1 lc rgb 'red'
set lt 2 lc rgb 'blue'
set lt 3 lc rgb 'green'


plot \
  $DATA using (4*$0):3:($0+1):xtic(2) w boxes lc variable t 'cat1', \
  $DATA using (4*$0):3:4 w yerrorbars lt 42 t '', \
  $DATA using (4*$0 + 1):6:($0+1):xtic(5) w boxes lc variable t '', \
  $DATA using (4*$0 + 1):(1/0):($0+2) w boxes lc variable t 'cat2', \
  $DATA using (4*$0 + 1):6:7 w yerrorbars lt 42 t '', \
  $DATA using (4*$0 + 2):9:($0+1):xtic(8) w boxes lc variable t '', \
  $DATA using (4*$0 + 1):(1/0):($0+3) w boxes lc variable t 'cat3', \
  $DATA using (4*$0 + 2):9:10 w yerrorbars lt 42 t ''
$DATA using (4*$0 + 1):6:($0+1):xtic(5) w boxes lc variable t '', \
$DATA using (4*$0 + 1):(1/0):($0+2) w boxes lc variable t 'cat2'