使用 Groupby 和 For 循环为每个类别绘制线图
Ploting Lineplot for Each Category using Groupby and For Loop
我想为以下日期集使用 groupby
的每个产品制作 subplot
的 lineplot
:
#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,然后单独绘制它。
就我个人而言,我更喜欢第一个选项。
我想为以下日期集使用 groupby
的每个产品制作 subplot
的 lineplot
:
#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()
就我个人而言,我更喜欢第一个选项。