如何将折线图拆分为 Python 中的子图?
How to split a line graph into subplots in Python?
目前我有一个线图,可以将所有内容绘制在一起:
import seasborn as sns
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType')
创建此图的方法很好
但是,我希望将每个类别拆分成自己的子图。我试过
f, axes = plt.subplots(3, 2, figsize=(12, 6), sharex=True, sharey=True)
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType' == 'Tornado', ax=axes[0,0], legend=False)
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType' == 'Flood', ax=axes[0,1], legend=False)
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType' == 'Fire', ax=axes[1,0], legend=False)
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType' == 'Hurricane', ax=axes[1,1], legend=False)
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType' == 'Severe Storm(s)', ax=axes[2,0], legend=False)
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType' == 'Snow', ax=axes[2,1], legend=False)
但它并没有像我预期的那样工作。似乎每次都在重复同一张图
我只是想将原始图中的每个线图拆分为自己的子图,但我不太确定我做错了什么。
另请注意,是否有更好、更复杂的方法来绘制每个子图,而无需为每个不同的类别逐字复制和粘贴?
您尝试执行的操作在语法上不正确,您应该这样写:
f, axes = plt.subplots(3, 2, figsize=(12, 6), sharex=True, sharey=True)
sns.lineplot(data=years_total[years_total.incidentType=='Tornado'], x='fyDeclared', y='count', ax=axes[0,0], legend=False)
sns.lineplot(data=years_total[years_total.incidentType=='Flood'], x='fyDeclared', y='count', ax=axes[0,1], legend=False)
(...)
但是,为了避免乏味的重复,您可以利用 seaborn 的 FacetGrid
,它正是为此目的而设计的。 FacetGrid
创建一个图形,其中每个 row/column 对应于分类变量的特定值。因此:
idx = pd.date_range(start='1950-01-01', end='2019-12-31', periods=100)
df = pd.DataFrame()
for type in ['Flood','Fire','Tornado']:
temp = pd.DataFrame({'fyDeclared':idx, 'count':np.random.random(100), 'incidentType':type})
df = pd.concat([df,temp])
g = sns.FacetGrid(data=df, col='incidentType', col_wrap=2)
g.map(sns.lineplot, 'fyDeclared', 'count')
目前我有一个线图,可以将所有内容绘制在一起:
import seasborn as sns
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType')
创建此图的方法很好
但是,我希望将每个类别拆分成自己的子图。我试过
f, axes = plt.subplots(3, 2, figsize=(12, 6), sharex=True, sharey=True)
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType' == 'Tornado', ax=axes[0,0], legend=False)
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType' == 'Flood', ax=axes[0,1], legend=False)
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType' == 'Fire', ax=axes[1,0], legend=False)
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType' == 'Hurricane', ax=axes[1,1], legend=False)
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType' == 'Severe Storm(s)', ax=axes[2,0], legend=False)
sns.lineplot(data=years_total, x='fyDeclared', y='count', hue='incidentType' == 'Snow', ax=axes[2,1], legend=False)
但它并没有像我预期的那样工作。似乎每次都在重复同一张图
我只是想将原始图中的每个线图拆分为自己的子图,但我不太确定我做错了什么。
另请注意,是否有更好、更复杂的方法来绘制每个子图,而无需为每个不同的类别逐字复制和粘贴?
您尝试执行的操作在语法上不正确,您应该这样写:
f, axes = plt.subplots(3, 2, figsize=(12, 6), sharex=True, sharey=True)
sns.lineplot(data=years_total[years_total.incidentType=='Tornado'], x='fyDeclared', y='count', ax=axes[0,0], legend=False)
sns.lineplot(data=years_total[years_total.incidentType=='Flood'], x='fyDeclared', y='count', ax=axes[0,1], legend=False)
(...)
但是,为了避免乏味的重复,您可以利用 seaborn 的 FacetGrid
,它正是为此目的而设计的。 FacetGrid
创建一个图形,其中每个 row/column 对应于分类变量的特定值。因此:
idx = pd.date_range(start='1950-01-01', end='2019-12-31', periods=100)
df = pd.DataFrame()
for type in ['Flood','Fire','Tornado']:
temp = pd.DataFrame({'fyDeclared':idx, 'count':np.random.random(100), 'incidentType':type})
df = pd.concat([df,temp])
g = sns.FacetGrid(data=df, col='incidentType', col_wrap=2)
g.map(sns.lineplot, 'fyDeclared', 'count')