堆积条形图,底部参数触发错误:形状不匹配:对象无法广播到单个形状

数据挖掘 Python matplotlib
2022-03-07 04:31:11

我在 python3 中工作,我想获得一个堆积条形图,在 5 个不同的列上显示三个不同的变量。如果我不在 plt.bar 中添加“底部参数”,我的代码可以正常工作(但我需要这样做,以便堆栈以正确的顺序出现):

import numpy as np
import matplotlib as plt

columns=['a','b','c','d','e']
pos = np.arange(5)
var_one=[40348,53544,144895,34778,14322,53546,33623,76290,53546]
var_two=[15790,20409,87224,22085,6940,27099,17575,41862,27099]
var_three=[692,3254,6645,1237,469,872,569,3172,872]

plt.bar(pos,var_one,color='green',edgecolor='green')
plt.bar(pos,var_two,color='purple',edgecolor='purple')
plt.bar(pos,var_three,color='yellow',edgecolor='yellow')
plt.xticks(pos, columns)
plt.show()

但是,一旦我在 bar.plot 中添加了底部参数(如下所示):

import numpy as np
import matplotlib as plt

columns=['a','b','c','d','e']
pos = np.arange(5)
var_one=[40348,53544,144895,34778,14322,53546,33623,76290,53546]
var_two=[15790,20409,87224,22085,6940,27099,17575,41862,27099]
var_three=[692,3254,6645,1237,469,872,569,3172,872]

plt.bar(pos,var_one,color='green',edgecolor='green')
plt.bar(pos,var_two,color='purple',edgecolor='purple',bottom=var_one)
plt.bar(pos,var_three,color='yellow',edgecolor='yellow',bottom=var_one+var_two)
plt.xticks(pos, columns)
plt.show()

代码触发错误

ValueError: shape mismatch: objects cannot be broadcast to a single shape

我该如何解决?

2个回答

如果您将代码更改为以下内容:

import numpy as np
import matplotlib.pyplot as plt

columns = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j']
pos = np.arange(9)
var_one = np.array([40348, 53544, 144895, 34778, 14322, 53546, 33623, 76290, 53546])
var_two = np.array([15790, 20409, 87224, 22085, 6940, 27099, 17575, 41862, 27099])
var_three = np.array([692, 3254, 6645, 1237, 469, 872, 569, 3172, 872])

plt.bar(pos, np.add(np.add(var_three, var_two), var_one), color='yellow', edgecolor='yellow')
plt.bar(pos, np.add(var_two, var_one), color='purple', edgecolor='purple')
plt.bar(pos, var_one, color='green', edgecolor='green')
plt.xticks(pos, columns)
plt.show()

结果将是这样的:

结果字符

该错误是由于您尝试+在两个数组之间使用而引起的,即串联。如果你做了:

plt.bar(pos, var_one, color='green', edgecolor='green')
plt.bar(pos, var_two, color='purple', edgecolor='purple', bottom=var_one)
plt.bar(pos, var_three, color='yellow', edgecolor='yellow', bottom=np.add(var_one,var_two))

它也会起作用的。这样你实际上使用了底部参数。如果您有大量未排序的数据,则此解决方案效果更好。