【问题标题】:Stacked Bar Chart is not working properly using matplotlib使用 matplotlib 堆积条形图无法正常工作
【发布时间】:2019-11-20 08:13:00
【问题描述】:

我正在尝试绘制 100% 堆积条形图,但输出错误。 对齐和百分比都搞砸了。

x = ["A","B","C","D"]
data1 = {'Price':[12,44,23,21]}
data2 = {'Cost':[15,40,10,15]}
data3 = {'Units':[22,12,23,15]}
y1 = pd.DataFrame(data1)
y2 = pd.DataFrame(data2)
y3 = pd.DataFrame(data3)
snum = y1['Price']+y2['Cost']+y3['Units']

y11 = y1['Price']/snum*100
y22 = y2['Cost']/snum*100
y33 = y3['Units']/snum*100

plt.figure(figsize=(4,3))

# stack bars
plt.bar(x, y11, label='y1')
plt.bar(x, y22 ,bottom=y11 ,label='y2')
plt.bar(x, y33 ,bottom=y11+y22+y33,label='y3')

for xpos, ypos, yval in zip(x, y11/2, y11):
    plt.text(xpos, ypos, "%.1f"%yval, ha="center", va="center")
for xpos, ypos, yval in zip(x, y11+y22/2, y22):
    plt.text(xpos, ypos, "%.1f"%yval, ha="center", va="center")
for xpos, ypos, yval in zip(x, y11+y22+y33/2, y33):
    plt.text(xpos, ypos, "%.1f"%yval, ha="center", va="center")

【问题讨论】:

  • 也许用plt.bar(x, y33,bottom=y11+y22,label='y3')替换plt.bar(x, y33,bottom=y11+y22+y33,label='y3')

标签: python matplotlib


【解决方案1】:

通过bottom=y11+y22+y33,第三个柱将从 100% 开始并伸出。只需删除 +y33 即可获得所需的结果。

这是修改后的代码,颜色也略有不同。如果您将边缘与条形颜色相同,则可以避免它们之间出现一些可能的白线。(我还导入了库并添加了show()。)

import pandas as pd
from matplotlib import pyplot as plt

x = ["A","B","C","D"]
data1 = {'Price':[12,44,23,21]}
data2 = {'Cost':[15,40,10,15]}
data3 = {'Units':[22,12,23,15]}
y1 = pd.DataFrame(data1)
y2 = pd.DataFrame(data2)
y3 = pd.DataFrame(data3)
snum = y1['Price']+y2['Cost']+y3['Units']

y11 = y1['Price']/snum*100
y22 = y2['Cost']/snum*100
y33 = y3['Units']/snum*100

plt.figure(figsize=(4,3))

# stack bars
plt.bar(x, y11, label='y1', color='#fbb4ae', edgecolor='#fbb4ae')
plt.bar(x, y22, bottom=y11, label='y2', color='#b3cde3', edgecolor='#b3cde3')
plt.bar(x, y33, bottom=y11+y22, label='y3', color='#ccebc5', edgecolor='#ccebc5')

for xpos, ypos, yval in zip(x, y11/2, y11):
    plt.text(xpos, ypos, "%.1f"%yval, ha="center", va="center")
for xpos, ypos, yval in zip(x, y11+y22/2, y22):
    plt.text(xpos, ypos, "%.1f"%yval, ha="center", va="center")
for xpos, ypos, yval in zip(x, y11+y22+y33/2, y33):
    plt.text(xpos, ypos, "%.1f"%yval, ha="center", va="center")

plt.show()

【讨论】:

  • 编辑:设置 edgecolor 以防止条之间出现白线。
猜你喜欢
  • 2017-11-02
  • 2018-01-17
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
相关资源
最近更新 更多