【问题标题】:ValueError: shape mismatch: objects cannot be broadcast to a single shape when plotting a barValueError:形状不匹配:绘制条形时无法将对象广播到单个形状
【发布时间】:2022-01-12 06:46:55
【问题描述】:

我尝试制作条形图。

购买价值

Buy_Coffee Buy_ColdDrinks Buy_Juices Buy_Pastries Buy_Sandwiches
0 0 1 0 1 0
1 1 0 0 0 0
2 1 0 0 0 1
3 1 0 0 0 0
4 1 0 0 0 1
5 1 0 0 0 0
plt.bar(purchase_value.index,
    purchase_value.value_counts(), 
    width=0.5, 
    bottom=None, 
    align='center', 
    color=['lightsteelblue', 
           'cornflowerblue', 
           'royalblue', 
           'midnightblue', 
           'darkblue'])
plt.xticks(rotation='vertical')
plt.show()

但事实证明

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

【问题讨论】:

  • 您确定purchase_value.value_counts() 是您想要的吗?这将为您提供每个唯一行的计数,在这种情况下,这些行与索引的长度不匹配。您能否在问题中阐明您希望条形图中的值是什么?
  • 我想知道一列中每个项目的总和。就像第一列“买咖啡”是 5。
  • 我相应地更新了我的答案

标签: python pandas dataframe matplotlib data-visualization


【解决方案1】:

当您调用 pandas.DataFrame.value_counts 时,您正在计算行值的每个唯一组合的计数。
因此,通过将此应用于您提供的数据,您将获得:

Buy_Coffee  Buy_ColdDrinks  Buy_Juices  Buy_Pastries  Buy_Sandwiches
1           0               0           0             0                 3
                                                      1                 2
0           1               0           1             0                 1

组合数可能不等于数据中的行数 (purchase_value.index)。
如果我正确理解您要绘制的内容,您应该使用:

import pandas as pd
import matplotlib.pyplot as plt

purchase_value = pd.read_csv(r'data/data.csv')

fig, ax = plt.subplots()

purchase_value.plot(kind = 'bar',
                    ax = ax,
                    stacked = True, 
                    width=0.5, 
                    bottom=0, 
                    align='center', 
                    color=['lightsteelblue', 
                           'cornflowerblue', 
                           'royalblue', 
                           'midnightblue', 
                           'darkblue'])

plt.show()


如果你想为每一列画出每个项目的总和,你应该使用:

fig, ax = plt.subplots()

purchase_value.sum(axis = 0).plot(kind = 'bar',
                                  ax = ax,
                                  stacked = True, 
                                  width=0.5, 
                                  bottom=0, 
                                  align='center', 
                                  color=['lightsteelblue', 
                                         'cornflowerblue', 
                                         'royalblue', 
                                         'midnightblue', 
                                         'darkblue'])

plt.tight_layout()

plt.show()

【讨论】:

  • 很抱歉我没有解释清楚。第二个情节就是我想要的!我很感激!
猜你喜欢
  • 2021-02-27
  • 2013-06-01
  • 1970-01-01
  • 2021-05-22
  • 2021-07-17
  • 1970-01-01
  • 2021-05-13
  • 2019-02-16
相关资源
最近更新 更多