我需要在子图中绘制 7 个图表,而不是 7 个单独的图,并且不确定如何将子图添加到其中,而不必手动绘制每个图的子图,而不是在循环中
这是我的代码片段:
year = ['2018','2019','2020','2021','2022','2023','2024']
for Year in year:
palette = {
'Q1': 'tab:blue',
'Q2': 'tab:green',
'Q3': 'tab:orange',
'Q4': 'tab:red',
}
sns.scatterplot(data=dfSumDate.loc[Year], x='Temperature',
y='MeanEnergy', hue='Season', palette=palette)
plt.ylim(0,120)
plt.xlim(-5,30)
plt.title(Year)
plt.show()
最好将它们绘制在 4x2 网格中,谢谢
这会将
seaborn
图放置在 4x2 网格上。最后有一些额外的代码来制作包含所有标签的单个图例,因为我无法使用其他方式以这种方式格式化图例。
测试数据:
import seaborn as sns
from matplotlib import pyplot as plt
#Test data
year = ['2018','2019','2020','2021','2022','2023','2024']
dfSumDate = pd.DataFrame(
{'MeanEnergy': range(1, 22),
'Temperature': range(10, 220, 10),
'Season': ['Q1', 'Q2', 'Q3', 'Q4', 'Q1', 'Q2', 'Q3'] * 3,
},
index=year * 3,
).sort_index()
绘图:
palette = {
'Q1': 'tab:blue',
'Q2': 'tab:green',
'Q3': 'tab:orange',
'Q4': 'tab:red',
}
f = plt.figure(figsize=(5, 8), layout='tight')
for i, Year in enumerate(year):
ax = f.add_subplot(4, 2, i + 1) #create subplot on 4x2 grid
sns.scatterplot(
data=dfSumDate.loc[Year],
x='Temperature',
y='MeanEnergy',
hue='Season',
palette=palette,
legend=False,
ax=ax
)
plt.title(Year, fontsize=11)
#Additional code for a single legend with no duplicates
from matplotlib.lines import Line2D
f.legend(
handles=[Line2D([], [], marker='o', ls='none', color=c) for c in palette.values()],
labels=palette.keys(),
bbox_to_anchor=(0.85, 0.23)
)
plt.show()
自动创建子图的最简单方法是通过 Seaborn 的
FacetGrid
。 sns.relplot(...)
为散点图创建这样的网格。为此,'Year'
需要是数据帧的显式列。
这是一些示例代码:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
year = ['2018', '2019', '2020', '2021', '2022', '2023', '2024']
dfSumDate = pd.DataFrame({'Season': np.random.choice(['Q1', 'Q2', 'Q3', 'Q4'], 1000),
'Temperature': np.random.randint(10, 30, 1000),
'MeanEnergy': np.random.uniform(10, 100, 1000)},
index=np.random.choice(year, 1000))
palette = {'Q1': 'tab:blue', 'Q2': 'tab:green', 'Q3': 'tab:orange', 'Q4': 'tab:red'}
# Convert the index to an real column
dfSumDate.index.name = 'Year'
dfSumDateWithYear = dfSumDate.reset_index()
sns.relplot(data=dfSumDateWithYear, col='Year', col_wrap=4, height=3, aspect=1,
x='Temperature', y='MeanEnergy', hue='Season', palette=palette)
plt.show()
ax=
关键字或者,Seaborn 的“轴级别”函数接受
ax=
关键字,您可以在其中设置需要绘制绘图的子图(“ax”):
fig = plt.figure(figsize=(10, 6))
for i, Year in enumerate(year):
ax = plt.subplot(2, 4, i + 1)
sns.scatterplot(data=dfSumDate.loc[Year], x='Temperature',
y='MeanEnergy', hue='Season', palette=palette, ax=ax)
ax.set_ylim(0, 120)
ax.set_xlim(-5, 30)
ax.set_title(Year)
plt.tight_layout()
plt.show()