熊猫/ matplotlib中的堆叠式交错水平条形图

艾可那洛尔

我有点像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不支持,可能需要重新考虑数据的格式。

提前致谢!

n1colas.m

您可以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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章