簡體   English   中英

如何使用 matplotlib 創建具有 timedeltas 的堆疊條形圖?

[英]How can I create a stacked barchart with timedeltas using matplotlib?

剛剛開始使用 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 個不同事件之間的時間增量(第一個事件和最后一個事件之間經過了多少天,包括其間的日期),使用堆疊的水平圖表來可視化顯示的數據。 每列應代表圖表中的一個條形。 整個圖表不是關於已經過去的絕對時間,而是關於五個事件的持續時間相對於一列的總持續時間,這意味着所有條形圖應該具有相同的總長度。

但是我還沒有找到任何類似的東西,也沒有自己找到解決方案。 我將非常感謝任何類型的解決方案來處理顯示的數據。

我不確定這是否是您要查找的內容,但是如果每列都應該是條形,並且您希望每列中的時間增量,那么您需要每行之間的天數差異,我是猜測第一行應該有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()

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM