Matplotlib在一张图中绘制多个条形图 [英] Matplotlib plot multiple bars in one graph

查看:95
本文介绍了Matplotlib在一张图中绘制多个条形图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含多个不同场景的条形图,但是当我绘制它时,所有条形都会重复.请在下面找到我的代码.

我知道我一次只使用列表中的一个值,但是当我尝试使用 data[0] 传递整个子数组时,我得到了一个值不匹配错误:

ValueError:形状不匹配:无法将对象广播为单个形状

我做错了什么?我看了

解决方案

您要按列绘制数据.因此,将列表转换为数组并选择要绘制的相应列是有意义的.

将 numpy 导入为 np导入matplotlib.pyplot作为plt数据 = 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]])长度= len(数据)x_labels = ['A', 'B', 'C', 'D', 'E', 'F']#设置绘图参数无花果,ax = plt.subplots()width = 0.2 # 条的宽度x = np.arange(长度)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 +宽度+宽度/2)ax.set_xticklabels(x_labels)ax.set_xlabel('Scenario')ax.set_title('标题')ax.legend()plt.grid(True, 'major', 'y', ls='--', lw=.5, c='k', alpha=.3)fig.tight_layout()plt.show()

I have a plot with multiple bars with different scenarios, but when I plot it all the bars are repeated. Please find below my code.

I know that I'm using only one value at a time from the list, but when I try to pass the whole sub-array using data[0] instead, I get a Value mismatch error:

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

What am I doing wrong? I looked at the PyPlot example and this other post and both pass an array to 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()

Result is:

解决方案

You want to plot the data column-wise. Hence it makes sense to convert the lists to arrays and select the respective column to plot.

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在一张图中绘制多个条形图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆