用 args 绘图以在同一图中有线条

plotting with args to have lines in the same plot

我希望根据时间绘制特征的多个值,我正在使用 *args 参数来这样做。我所拥有的是在我的函数中输入两个或更多参数时的几个图,我明白为什么会这样。但是,我无法弄清楚如何将它们全部放在同一个情节中。这是我的代码来启发我的意图。

示例数据:

year  city     population
2013  Ankara   xxxx
2013  London   xxxx
2013  Paris    xxx
....  .....    xxx
2014  Ankara   xxxx
2014  London   xxx
2014  Paris    xxxx
...   ....     ....
2015  Ankara   xxxx
....  ....     ....

当我这样做时 df[df['city']=='Ankara' 我得到了安卡拉人口和独特年份的 df。现在我要做的是从中获取 2 个或三个城市并将它们绘制在同一个地块上。

 def city_over_time(*args):

     global df

     for city in args:
         df=df[df['city']==city]

         plt.plot(df.year, df.population)
         plt.tight_layout()

所以当我执行以下操作时:

city_over_time('Manchester', 'Liverpool')

我在下面得到一张曼彻斯特的地块和另一张利物浦的地块。但我希望两者都在同一个数字中。就像我正在策划以下内容一样:

 plt.plot(df[df.city=='Manchester']['year'], df[df.city=='Manchester']['population'])
 plt.plot(df[df.city=='Liverpool']['year'], df[df.city=='Liverpool']['population'])

使用pivot to get data in a more usable format, select cities as columns, then plot:

def city_over_time(frame, *cities):
    plot_df = frame.pivot(index='year',
                          columns='cities',
                          values='population')[list(cities)]
    plot_df.plot(xticks=plot_df.index,
                 ylabel='Population')
    plt.tight_layout()
    plt.show()

带有示例数据的完整工作示例:

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

np.random.seed(5)
df = pd.DataFrame({
    'year': np.repeat(np.arange(2013, 2016), 3),
    'cities': ['Ankara', 'London', 'Paris'] * 3,
    'population': np.random.randint(100_000, 200_000, size=9)
})

print(df)


def city_over_time(frame, *cities):
    plot_df = frame.pivot(index='year',
                          columns='cities',
                          values='population')[list(cities)]
    plot_df.plot(xticks=plot_df.index,
                 ylabel='Population')
    plt.tight_layout()
    plt.show()


city_over_time(df, 'London', 'Paris')

df:

   year  cities  population
0  2013  Ankara      135683
1  2013  London      118638
2  2013   Paris      120463
3  2014  Ankara      105520
4  2014  London      159465
5  2014   Paris      133800
6  2015  Ankara      133508
7  2015  London      181639
8  2015   Paris      134750

plot_dfdfpivot 之后过滤 cities):

cities  London   Paris
year                  
2013    118638  120463
2014    159465  133800
2015    181639  134750