Постройте фрейм данных pandas с использованием matplotlib с данными, сгруппированными по годам / месяцам - PullRequest
1 голос
/ 08 мая 2020

Я использую jupyter, pandas и matplotlib для создания графика со следующими данными.

Как мне создать график, который группирует данные вместе по месяцам и годам по оси x, чтобы сделать понятнее, что месяц связан с годом

year    month count
2005    9   40789
2005    10  17998
...
2014    12  2168
2015    1   2286
2015    2   1274
2015    3   1126
2015    4   344
df.plot(kind='bar',x='month',y='num',color='blue', title="Num per year")
plt.show()

enter image description here

Ответы [ 2 ]

3 голосов
/ 08 мая 2020

Вы можете раскрашивать каждый год в другой цвет.

Создайте некоторые данные:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np

# here's some data
N=50
df = pd.DataFrame({'year': np.random.randint(2005,2015,N),
                   'month': np.random.randint(1,12,N),
                   'count': np.random.randint(1,1500,N)})
df.sort_values(by=['year', 'month'],inplace=True)

А затем создайте массив цветов с цветом для каждого года:

# color map based on years
yrs = np.unique(df.year)
c = cm.get_cmap('tab20', len(yrs))
## probably a more elegant way to do this...
yrClr = np.zeros((len(df.year),4))
for i, v in enumerate(yrs): 
    yrClr[df.year==v,:]=c.colors[i,:]

# then use yrClr for color               
df.plot(kind='bar', x='month', y='count', color=yrClr, title="Num per year")

ОБНОВЛЕНИЕ: также может помочь объединить вашу ось x Месяц + Год, например это .

fig, axs = plt.subplots(figsize=(12, 4))
df['MonthYr']=pd.to_datetime(df.assign(day=1)[['year','month','day']]).dt.strftime('%m-%Y')
df.plot(kind='bar', x='MonthYr', y='count', color=yrClr, title="Num per year",ax=axs)

enter image description here

2 голосов
/ 08 мая 2020

Вы можете использовать sns.barplot с hue и dodge:

sns.barplot(data=df, x='year', hue='month', y='count', dodge=True)

Или вы можете повернуть таблицу и использовать plot.bar():

(df.pivot_table(index='year', columns='month', 
               values='count', aggfunc='sum')
   .plot.bar()
)

, что будет даст вам что-то вроде этого:

enter image description here

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