Matplotlib 在一张图中绘制多个条形图
Posted
技术标签:
【中文标题】Matplotlib 在一张图中绘制多个条形图【英文标题】:Matplotlib plot multiple bars in one graph 【发布时间】:2019-04-19 21:31:15 【问题描述】:我有一个包含多个不同场景的条形图,但是当我绘制它时,所有条形都会重复。请在下面找到我的代码。
我知道我一次只使用列表中的一个值,但是当我尝试使用 data[0]
传递整个子数组时,我得到一个值不匹配错误:
ValueError: shape mismatch: objects cannot be broadcast to a single shape
我做错了什么?我查看了PyPlot example 和this other 的帖子,都将数组传递给ax.bar
。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = [[20, 35, 30, 40], [25, 40, 45, 30],
[15, 20, 35, 45], [10, 25, 40, 15],
[50, 20, 45, 55], [10, 55, 60, 20]]
data_std = [[1, 2, 1, 2], [1, 2, 1, 2], [1, 2, 1, 2],
[1, 2, 1, 2], [1, 2, 1, 2], [1, 2, 1, 2]]
length = len(data)
x_labels = ['A', 'B', 'C', 'D', 'E', 'F']
# Set plot parameters
fig, ax = plt.subplots()
width = 0.2 # width of bar
x = np.arange(length)
ax.bar(x, data[0][0], width, color='#000080', label='Case-1', yerr=data_std[0][0])
ax.bar(x + width, data[0][1], width, color='#0F52BA', label='Case-2', yerr=data_std[0][1])
ax.bar(x + (2 * width), data[0][2], width, color='#6593F5', label='Case-3', yerr=data_std[0][2])
ax.bar(x + (3 * width), data[0][3], width, color='#73C2FB', label='Case-4', yerr=data_std[0][3])
ax.set_ylabel('Metric')
ax.set_ylim(0,75)
ax.set_xticks(x + width + width/2)
ax.set_xticklabels(x_labels)
ax.set_xlabel('Scenario')
ax.set_title('Title')
ax.legend()
plt.grid(True, 'major', 'y', ls='--', lw=.5, c='k', alpha=.3)
fig.tight_layout()
plt.show()
结果是:
【问题讨论】:
当您“使用 data[0] 传递整个子数组”时,预期的结果是什么?这似乎没有多大意义,所以也许您想解释一下您希望看到的情节是什么样的? @ImportanceOfBeingErnest 我用当前情节更新了帖子。如您所见,每个场景的所有条形图都是相同的。我想更改代码以绘制其他值 【参考方案1】:您希望按列绘制数据。因此,将列表转换为数组并选择要绘制的相应列是有意义的。
import numpy as np
import matplotlib.pyplot as plt
data = np.array([[20, 35, 30, 40], [25, 40, 45, 30],
[15, 20, 35, 45], [10, 25, 40, 15],
[50, 20, 45, 55], [10, 55, 60, 20]])
data_std = np.array([[1, 2, 1, 2], [1, 2, 1, 2], [1, 2, 1, 2],
[1, 2, 1, 2], [1, 2, 1, 2], [1, 2, 1, 2]])
length = len(data)
x_labels = ['A', 'B', 'C', 'D', 'E', 'F']
# Set plot parameters
fig, ax = plt.subplots()
width = 0.2 # width of bar
x = np.arange(length)
ax.bar(x, data[:,0], width, color='#000080', label='Case-1', yerr=data_std[:,0])
ax.bar(x + width, data[:,1], width, color='#0F52BA', label='Case-2', yerr=data_std[:,1])
ax.bar(x + (2 * width), data[:,2], width, color='#6593F5', label='Case-3', yerr=data_std[:,2])
ax.bar(x + (3 * width), data[:,3], width, color='#73C2FB', label='Case-4', yerr=data_std[:,3])
ax.set_ylabel('Metric')
ax.set_ylim(0,75)
ax.set_xticks(x + width + width/2)
ax.set_xticklabels(x_labels)
ax.set_xlabel('Scenario')
ax.set_title('Title')
ax.legend()
plt.grid(True, 'major', 'y', ls='--', lw=.5, c='k', alpha=.3)
fig.tight_layout()
plt.show()
【讨论】:
以上是关于Matplotlib 在一张图中绘制多个条形图的主要内容,如果未能解决你的问题,请参考以下文章
如何在 matplotlib pandas 的一张图中组合两个文件的两个条形图
Python Matplotlib 在条形图中绘制样本均值,具有置信区间,但看起来像箱形图
python matplotlib一张图中绘制不同类型叠加图