使用 Groupby 和 For 循环为每个类别绘制线图

Ploting Lineplot for Each Category using Groupby and For Loop

我想为以下日期集使用 groupby 的每个产品制作 subplotlineplot

#Create DataFrame
df = pd.DataFrame({'day': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5],
                   'product': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
                   'sales': [4, 7, 8, 12, 15, 8, 11, 14, 19, 20],
                   'avline': [9, 9, 9, 9, 9, 17, 17, 17, 17, 17]})

# Glimpse of DataFrame
df
    day product sales   avline
0   1   A   4   9
1   2   A   7   9
2   3   A   8   9
3   4   A   12  9
4   5   A   15  9
5   1   B   8   17
6   2   B   11  17
7   3   B   14  17
8   4   B   19  17
9   5   B   20  17

我正在使用 for 循环尝试以下代码,因为我想稍后为每个产品添加 axvline

fig, ax = plt.subplots()
for k, v in df.groupby('product'):
    v.plot(x='day', y='sales', label=k, ax=ax)

但是,我得到了下面的图,我想为每个产品单独绘制线图。

最明智的做法是什么?任何建议,将不胜感激。谢谢!

你可以试试这个:

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({'day': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5],
                   'product': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
                   'sales': [4, 7, 8, 12, 15, 8, 11, 14, 19, 20],
                   'avline': [9, 9, 9, 9, 9, 17, 17, 17, 17, 17]})

colors = ['b', 'r']
fig, ax = plt.subplots(1, 2) # 1 row, 2 columns 

for i, (k, v) in enumerate(df.groupby('product')):
    v.plot(x='day', y='sales', c=colors[i], label=k, ax=ax[i])
    # add a vertical line 
    ax[i].axvline(v.iloc[0]['avline'], linestyle="--")

它给出:

根据我的理解,为每个产品生成多个线图:

第一个是使用 seaborn.FacetGrid,它将为您提供每个产品类别的多个线图。

import seaborn as sns
graph = sns.FacetGrid(df, col ="product")
graph.map(plt.plot, "day", "sales")
plt.show()

这会给你这样的输出:

否则,你也可以使用plt.plot给你多个线图。

lst = df['product'].unique()
for ls in lst:
    df1 = df[df['product'] == ls]
    plt.plot('day','sales',data=df1)
    plt.title(f'Product {ls}')
    plt.show()

这将创建一个新的 df,然后单独绘制它。

就我个人而言,我更喜欢第一个选项。