Как я могу создать составную диаграмму с timedeltas, используя matplotlib? - PullRequest
2 голосов
/ 28 апреля 2020

только попадаю в визуализацию данных с pandas. На данный момент я пытаюсь визуализировать pd с matplotlib, который выглядит следующим образом:

              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 Ответ

0 голосов
/ 28 апреля 2020

Я не совсем уверен, что это то, что вы ищете, но если каждый столбец должен быть столбцом, и вы хотите, чтобы временные разницы в каждом столбце, то вам нужна разница в днях между каждой строкой, и я предполагаю, что первая строка должна иметь разницу в 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()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...