【问题标题】:Align stacked bar charts usind pandas使用 pandas 对齐堆积条形图
【发布时间】:2018-08-22 18:11:09
【问题描述】:

我正在尝试对齐所有具有相同索引的堆叠条形图。 这样做的最佳方法是什么?

这是我目前的代码:

xantho99 = [545/60, 6/60, 1688/60, 44/60]
buch99 = [51/60, 2/60, 576/60, 7/60]
myco99 = [519/60, 9/60, 889/60, 28/60]
cory99 = [247/60, 5/60, 1160/60, 28/60]
xantho90 = [545/60, 8/60, 989/60, 27/60]
buch90 = [51/60, 3/60, 523/60, 5/60]
myco90 = [519/60, 11/60, 802/60, 32/60]
cory90 = [247/60, 7/60, 899/60, 27/60]
xanthouc = [545/60, 0/60, 5407/60, 193/60]
buchuc = [51/60, 0/60, 1014/60, 20/60]
mycouc = [519/60, 0/60, 4644/60, 101/60]
coryuc = [247/60, 0/60, 2384/60, 77/60]
df = pd.DataFrame([xantho, xantho99, xantho90, buch, buch99, buch90, myco, myco99, myco90, cory, cory99, cory90], columns=['Prodigal', 'Cd-hit', 'PSOT', 'Zusammenführen'], index=["X", "X","X", "B", "B","B", "M", "M","M", "C", "C","C"])
df.columns.name = "Abschnitt"
current_palette = "blue", "green", "red", "yellow"
ax = df.plot.bar(stacked=True, title="Zeitbedarf der einzelnen Abschnitte (Xanthomonas)", xlim=(0, sum(xantho)*1.1), color=current_palette, rot=0)
ax.set_xlabel("Zeit in Stunden")

谢谢!

【问题讨论】:

  • 对齐是否意味着要将所有标有X 的 3 个条组合成一个条,并将红色/蓝色/绿色/黄色值全部加在一起?
  • 不只是想在它们之间不留空间

标签: python pandas stacked


【解决方案1】:

这里是相关代码(如果你把它放在问题脚本的底部应该可以工作):

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
...
...
...
# Comment out old plot
# ax = df.plot.bar(stacked=True, title="Zeitbedarf der einzelnen Abschnitte (Xanthomonas)", xlim=(0, sum(xantho)*1.1), color=current_palette, rot=0)                                                         
# ax.set_xlabel("Zeit in Stunden")                                                                                                                   
spacing = [0, 0, 0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0]
p1 = plt.bar(np.arange(12) + spacing, df['Prodigal'], color="blue", width=1.0, edgecolor="black")
p2 = plt.bar(np.arange(12) + spacing, df['PSOT'], bottom=df['Prodigal'], color="red", width=1.0, edgecolor="black")
p3 = plt.bar(np.arange(12) + spacing, df['Zusammenführen'], bottom=df['Prodigal'] + df['PSOT'], color="yellow", width=1.0, edgecolor="black")
p4 = plt.bar(np.arange(12) + spacing, df['Cd-hit'], bottom=df['Prodigal'] + df['PSOT'] + df['Zusammenführen'], color="green", width=1.0, edgecolor="black")
plt.legend((p1[0], p2[0], p3[0], p4[0]), ('Prodigal', 'PSOT', 'Zusammenführen', 'Cd-hit'))
plt.show()

这是运行此 sn-p 后弹出的内容:

根据我们在 cmets 中的讨论,我认为这是我们想要的。 HTH,如果这就是你要找的,请告诉我!

【讨论】:

  • 谢谢!但它应该像只有具有相同索引对齐的那些。不同的索引之间应该有差距。
  • 看起来pandas 不支持开箱即用的不同宽度。我认为它可能应该,我会在今晚的某个时候尝试为 pandas 做一个 PR 来解决这个问题。同时,我将尝试使用matplotlib 提出解决方案
  • 非常感谢!感谢您的帮助!
  • @davin 这并不完美,但应该可以帮助您入门。标签等仍然存在一些问题,但至少存在分组。这些东西也不需要硬编码,但我会把它作为练习留给你;)
  • 另外图例顺序不对哈哈。我稍后会修复它。 HTH,这足以让您继续您的工作。祝你好运!
猜你喜欢
  • 2017-04-29
  • 2016-05-24
  • 2018-05-09
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
相关资源
最近更新 更多