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.groupbyam 'date'und 'group'beim Aggregieren .sumauf'time'
    • Der .dtExtraktor wird verwendet, um nur die .dateKomponente der 'date'Säule zu extrahieren .
    • 'Date'Stellen Sie sicher, dass die Spalte Ihres Datenrahmens ordnungsgemäß als datetime dtype, mit formatiert istdf.Date = pd.to_datetime(df.Date)
  • Der gruppierte Datenrahmen dfgmuss in die richtige Form gebracht werden, was mit erreicht werden kann pandas.DataFrame.pivot.
  • Der einfachste Weg, ein Balkendiagramm zu stapeln, ist mit pandas.DataFrame.plot.barund verwenden Sie den stackedParameter.
    • Siehe pandas.DataFrame.plotfür alle Parameter.
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()