我希望做一個subplot的lineplot使用每個產品的groupby以下dateset:
#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)
但是,我得到了以下圖,并且我想要每個產品的單獨線圖。

最聰明的做法是什么?任何建議,將不勝感激。謝謝!
uj5u.com熱心網友回復:
根據我的理解,為每個產品生成多個線圖:
第一個是使用 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 然后單獨繪制它。
就個人而言,我更喜歡第一種選擇。
uj5u.com熱心網友回復:
你可以試試這個:
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="--")
它給:

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/409495.html
標籤:
上一篇:如何在資料框中按串列值分組和計數
