我有点像python新手,但是我试图创建一个水平堆叠的条形图,以显示活动的顺序和持续时间。
数据以以下格式存储在熊猫中。
Team Name | Duration | Activity | Activity Colour
0 Party Planners 1 | 3.0 | Cake | #7E07F7
1 Party Planners 1 | 4.0 | Balloon | #EBB975
2 Party Planners 1 | 2.0 | Cake | #7E07F7
3 Party Planners 1 | 1.0 | Entertainment | #214B22
4 Party Planners 1 | 5.0 | Balloon | #EBB975
5 Party Planners 2 | 1.0 | Cake | #7E07F7
6 Party Planners 2 | 3.0 | Logistics | #27943A
理想情况下,应该有两个系列,“派对筹划者1”和“派对筹划者2”,其中要遵循活动的顺序,并且颜色应与数据框中的颜色相对应。打扰一下油漆,但是像这样:
有人知道这种数据结构格式是否可行?如果matplotlib不支持,可能需要重新考虑数据的格式。
提前致谢!
您可以groupby
用来创建每个计划器水平条(我在reverse(tuple(...))
这里使用是为了保留预期的演示顺序)。然后,您可以使用matplotlib.pyplot.barh在分组的水平线上显示每个活动。将参数left
用作标量值,并将barh
该组的所有先前已绘制活动的总和应用于目标输出。
y,宽度,高度中的每
left
一个可以是应用于所有条形的标量,也可以是长度N的序列,为每个条形提供单独的值。
参数::
left
标量序列。条形图左侧的x坐标(默认值:0)。
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("data.csv")
print(df)
for name, group in reversed(tuple(df.groupby("Team Name"))):
leftsum = 0
for idx, row in group.iterrows():
plt.barh(row["Team Name"], row["Duration"], left=leftsum,
label=df.loc[idx, "Activity"],
color=df.loc[idx, "Activity Colour"])
leftsum = sum(group.loc[:idx, "Duration"])
# remove duplicate labels
handles, labels = plt.gca().get_legend_handles_labels()
by_label = dict(zip(labels, handles))
plt.legend(by_label.values(), by_label.keys())
plt.xlabel('Duration')
plt.show()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句