So erstellen Sie ein gestapeltes Balkendiagramm mit einer Zeitreihe und aggregierten Werten
Nov 25 2020
Ich habe Probleme beim Erstellen einer gestapelten Balkendiagramm-Zeitreihe aus meinem Pandas-Datenrahmen (Bild unten). Ich möchte das 'Datum' auf der x-Achse, die 'Stunden' auf der y-Achse und jeden Balken haben, um die Zeit anzuzeigen, die mit jeder Gruppe in 'Kategorie' verbracht wurde.

Muss ich die Pandas - Groupby - Funktion verwenden? Der Datenrahmen ist ein Beispiel. Ich habe Hunderte von Datenzeilen von 2018 bis 2020.
Antworten
3 TrentonMcKinney Nov 25 2020 at 07:35
- Es gibt eine Lösung für Pandas - gestapeltes Balkendiagramm mit Zeitreihendaten
- Das Problem bei dieser Frage ist, dass OP keine Daten aggregiert, sodass diese Lösung für diese Frage nicht funktioniert.
- Verwenden Sie
pandas.DataFrame.groupby
am'date'
und'group'
beim Aggregieren.sum
auf'time'
- Der
.dt
Extraktor wird verwendet, um nur die.date
Komponente der'date'
Säule zu extrahieren . 'Date'
Stellen Sie sicher, dass die Spalte Ihres Datenrahmens ordnungsgemäß alsdatetime
dtype
, mit formatiert istdf.Date = pd.to_datetime(df.Date)
- Der
- Der gruppierte Datenrahmen
dfg
muss in die richtige Form gebracht werden, was mit erreicht werden kannpandas.DataFrame.pivot
. - Der einfachste Weg, ein Balkendiagramm zu stapeln, ist mit
pandas.DataFrame.plot.bar
und verwenden Sie denstacked
Parameter.- Siehe
pandas.DataFrame.plot
für alle Parameter.
- Siehe
import pandas as pd
import matplotlib.pyplot as plt
import random # for test data
import numpy as np # for test data
# setup dataframe with test data
np.random.seed(365)
random.seed(365)
rows = 1100
data = {'hours': np.random.randint(10, size=(rows)),
'group': [random.choice(['A', 'B', 'C']) for _ in range(rows)],
'date': pd.bdate_range('2020-11-24', freq='h', periods=rows).tolist()}
df = pd.DataFrame(data)
# display(df.head())
hours group date
0 2 C 2020-11-24 00:00:00
1 4 B 2020-11-24 01:00:00
2 1 C 2020-11-24 02:00:00
3 5 A 2020-11-24 03:00:00
4 2 B 2020-11-24 04:00:00
# use groupby on df
dfg = df.groupby([df.date.dt.date, 'group'])['hours'].sum().reset_index()
# pivot the dataframe into the correct format
dfp = dfg.pivot(index='date', columns='group', values='hours')
# display(dfp.head())
group A B C
date
2020-11-24 49 25 29
2020-11-25 62 18 57
2020-11-26 42 77 4
2020-11-27 34 43 17
2020-11-28 28 53 23
# plot the pivoted dataframe
dfp.plot.bar(stacked=True, figsize=(10, 6), ylabel='Hours', xlabel='Date', title='Sum of Daily Category Hours')
plt.legend(title='Category', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.show()

- Für jeden Tag gibt es eine Leiste. So funktionieren Balkenplot-Ticks, sodass der Plot bei vielen Daten sehr breit sein kann.
- Erwägen Sie die Verwendung
pandas.DataFrame.barh
dfp.plot.barh(stacked=True, figsize=(6, 10), title='Sum of Daily Category Hours')
plt.legend(title='Category', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.xlabel('Hours')
plt.ylabel('Date')
plt.show()

- Das OP gibt an, dass es Daten von 2018 bis 2020 gibt, was bedeutet, dass Daten im Wert von über 700 Tagen vorliegen können, was über 700 Balken im Balkendiagramm entspricht.
- Ein Standardliniendiagramm ist möglicherweise die beste Option, um die Daten richtig zu visualisieren.
dfp.plot(figsize=(10, 6))
plt.show()
