为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 matplotlib 创建带有 timedeltas 的堆叠条形图?

如何使用 matplotlib 创建带有 timedeltas 的堆叠条形图?

婷婷同学_ 2022-10-25 16:09:47
刚刚开始使用 pandas 进行数据可视化。目前,我尝试使用 matplotlib 可视化一个 pd,如下所示:              Initiative_160608 Initiative_160570 Initiative_160056  Beschluss_BR         2009-05-15        2009-05-15        2006-04-07   Vorlage_BT           2009-05-22        2009-05-22        2006-04-26   Beratung_BT          2009-05-28        2009-05-28        2006-05-11   ABeschluss_BT        2009-06-17        2009-06-17        2006-05-17   Beschlussempf        2009-06-17        2009-06-17        2006-05-26   如您所见,我有许多列,其中包含五个不同的日期(每个日期都象征着五个事件链中的一个事件)。现在解决问题:我的计划是使用 5 个不同事件之间的时间增量(第一个事件和最后一个事件之间经过了多少天,包括其间的日期),使用堆叠的水平图表来可视化显示的数据。每列应代表图表中的一个条形。整个图表不是关于已经过去的绝对时间,而是关于五个事件的持续时间相对于一列的总持续时间,这意味着所有条的总长度应该相同。但是我还没有找到任何类似的东西,也没有自己找到解决方案。我将非常感谢任何类型的解决方案来处理显示的数据。
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

我不确定这是否是您要查找的内容,但是如果每列都应该是条形,并且您希望每列中的时间增量,那么您需要每行之间的天数差异,我是猜测第一行应该有0天的差异(因为它是起点)。


同样对于堆叠条形图,索引用于创建类别,但在您的情况下,您希望列作为类别,并且每个条形图由不同的索引值组成。这意味着您最终需要转置您的 df 。


这个解决方案非常丑陋,但希望它有所帮助。


import numpy as np

import pandas as pd

import matplotlib.pyplot as plt


df = pd.DataFrame({

    "Initiative_160608": ['2009-05-15', '2009-05-22', '2009-05-28', '2009-06-17', '2009-06-17'],

    "Initiative_160570": ['2009-05-15', '2009-05-22', '2009-05-28', '2009-06-17', '2009-06-17'],

    "Initiative_160056": ['2006-04-07', '2006-04-26', '2006-05-11', '2006-05-17', '2006-05-26']})

df.index = ['Beschless_BR', 'Vorlage_BT', 'Beratung_BT', 'ABeschless_BT', 'Beschlussempf']


# convert everything to dates

df = df.apply(lambda x: pd.to_datetime(x, format="%Y-%m-%d"))


def get_days(x):

    diff_list = []

    for i in range(len(x)):

        if i == 0:

            diff_list.append(x[i] - x[i])

        else:

            diff_list.append(x[i] - x[i-1])

    return diff_list

# get the difference in days, then convert back to numbers

df_diff = df.apply(lambda x: get_days(x), axis = 0) 

df_diff = df_diff.apply(lambda x: x.dt.days)

# transpose the matrix so that each initiative becomes a stacked bar

df_diff = df_diff.transpose()

# replace 0 values with 0.2 so that the bars are visible

df_diff = df_diff.replace(0, 0.2)

df_diff.plot.bar(stacked = True)

plt.show()

//img1.sycdn.imooc.com//635799e90001af7705870448.jpg

查看完整回答
反对 回复 2022-10-25
  • 1 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信