Как построить несколько линейных графиков на одной фигуре (оверлей / групповой) - PullRequest
1 голос
/ 17 июня 2019

Я хотел бы проиллюстрировать изменение в одной переменной для нескольких человек в моих данных с течением времени. У меня есть несколько проблем с основными командами здесь.

Вот мои данные:

import pandas as pd
df = pd.DataFrame({'year': ['1988', '1989', '1990', '1988', '1989', '1990', '1988', '1989', '1990'],
                   'id': ['1', '1', '1', '2', '2', '2', '3', '3', '3'],
                   'money': ['5', '7', '8', '8', '3', '3', '7', '8', '10']}).astype(int)

df.info()
df

Я попытался использовать matplotlib и начал цикл для каждого из моих уникальных идентификаторов. Я новичок в этом пакете. Во-первых, как я могу указать для каждого графика, что только 3 точки связаны для линии, а не все? Во-вторых, как я могу наложить эти графики на одну фигуру?

import matplotlib.pyplot as plt

for i in df.id.unique():
        df.plot.line(x='year', y='money')

Ответы [ 3 ]

2 голосов
/ 17 июня 2019

Можно также сделать с помощью простого pivot

df.pivot(index='year', columns='id', values='money').plot(rot=45)

enter image description here

Если в некоторых записях отсутствуют годы, это не будет отображаться идеально, поэтому добавьте интерполяцию:

(df.pivot(index='year', columns='id', values='money')
   .apply(pd.Series.interpolate, limit_area='inside')
   .plot())
2 голосов
/ 17 июня 2019

Вы также можете использовать либо groupby:

df.set_index('year').groupby('id').money.plot()

, что дает:

enter image description here

, либо используйте seaborn с hue

sns.lineplot(x='year',y='money', hue='id', data=df)

, что дает:

enter image description here

2 голосов
/ 17 июня 2019

Поскольку вы пометили matplotlib, одним из решений является проверка на id при циклическом просмотре DataFrame перед построением графика с использованием df[df['id']==i].

Чтобы наложить эти графики на одну фигуру, создайте объект фигуры и передайте ось ax в функцию df.plot().

import matplotlib.pyplot as plt
import pandas as pd
df = pd.DataFrame({'year': ['1988', '1989', '1990', '1988', '1989', '1990', '1988', '1989', '1990'],
                   'id': ['1', '1', '1', '2', '2', '2', '3', '3', '3'],
                   'money': ['5', '7', '8', '8', '3', '3', '7', '8', '10']}).astype(int)

fig, ax = plt.subplots()

for i in df.id.unique():
    df[df['id']==i].plot.line(x='year', y='money', ax=ax, label='id = %s'%i)
plt.xticks(np.unique(df.year),rotation=45)    

enter image description here

Решение Pandas с использованием groupby будет выглядеть следующим образом. Здесь вам придется изменить легенды позже.

df.groupby('id').plot(x='year', y='money',legend=True, ax=ax)

h,l = ax.get_legend_handles_labels()
ax.legend(h, df.id.unique(), fontsize=12)
plt.xticks(np.unique(df.year), rotation=45)
...