如何将平均线和中线添加到 Seaborn displot
How to add a mean and median line to a Seaborn displot
有没有办法将平均值和中位数添加到 Seaborn 的 displot
?
penguins = sns.load_dataset("penguins")
g = sns.displot(
data=penguins, x='body_mass_g',
col='species',
facet_kws=dict(sharey=False, sharex=False)
)
基于Add mean and variability to seaborn FacetGrid distplots,我看到我可以定义一个FacetGrid
并映射一个函数。我可以将自定义函数传递给 displot
吗?
尝试直接使用 displot
的原因是这些图开箱即用更漂亮,无需调整刻度标签大小、轴标签大小等,并且在视觉上与我的其他图一致制作.
def specs(x, **kwargs):
ax = sns.histplot(x=x)
ax.axvline(x.mean(), color='k', lw=2)
ax.axvline(x.median(), color='k', ls='--', lw=2)
g = sns.FacetGrid(data=penguins, col='species')
g.map(specs,'body_mass_g' )
- 使用
FacetGrid
directly is not recommended. Instead, use other figure-level methods like seaborn.displot
- 测试于
python 3.8.11
、pandas 1.3.2
、matplotlib 3.4.3
、seaborn 0.11.2
选项 1
- 使用
plt.
而不是 ax
。
- 在 OP 中,
vlines
将 ax
用于 histplot
,但在这里,图形是在 .map
之前创建的。
penguins = sns.load_dataset("penguins")
g = sns.displot(
data=penguins, x='body_mass_g',
col='species',
facet_kws=dict(sharey=False, sharex=False)
)
def specs(x, **kwargs):
plt.axvline(x.mean(), c='k', ls='-', lw=2.5)
plt.axvline(x.median(), c='orange', ls='--', lw=2.5)
g.map(specs,'body_mass_g' )
选项 2
- 此选项更冗长,但更灵活,因为它允许从用于创建
displot
的数据源以外的数据源访问和添加信息。
import seaborn as sns
import pandas as pd
# load the data
pen = sns.load_dataset("penguins")
# groupby to get mean and median
pen_g = pen.groupby('species').body_mass_g.agg(['mean', 'median'])
g = sns.displot(
data=pen, x='body_mass_g',
col='species',
facet_kws=dict(sharey=False, sharex=False)
)
# extract and flatten the axes from the figure
axes = g.axes.flatten()
# iterate through each axes
for ax in axes:
# extract the species name
spec = ax.get_title().split(' = ')[1]
# select the data for the species
data = pen_g.loc[spec, :]
# print data as needed or comment out
print(data)
# plot the lines
ax.axvline(x=data['mean'], c='k', ls='-', lw=2.5)
ax.axvline(x=data['median'], c='orange', ls='--', lw=2.5)
两个选项的输出
资源
- 另请参阅以下 questions/answers 以了解向 seaborn FacetGrid 添加信息的其他方法
这里可以使用sns.FacetGrid.facet_data
迭代子图和底层数据的索引
这与 sns.FacetGrid.map
的工作原理很接近。 sns.FacetGrid.facet_data
是一个生成元组 (i, j, k)
的行、列、色调索引和 data
的数据帧,它是对应于每个方面的完整数据的子集。
import seaborn as sns
import pandas as pd
pen = sns.load_dataset("penguins")
# Set our x_var for later use
x_var = "body_mass_g"
g = sns.displot(
data=pen,
x=x_var,
col="species",
facet_kws=dict(sharey=False, sharex=False),
)
for (row, col, hue_idx), data in g.facet_data():
# Skip empty data
if not data.values.size:
continue
# Get the ax for `row` and `col`
ax = g.facet_axis(row, col)
# Set the `vline`s using the var `x_var`
ax.axvline(data[x_var].mean(), c="k", ls="-", lw=2.5)
ax.axvline(data[x_var].median(), c="orange", ls="--", lw=2.5)
输出:
有没有办法将平均值和中位数添加到 Seaborn 的 displot
?
penguins = sns.load_dataset("penguins")
g = sns.displot(
data=penguins, x='body_mass_g',
col='species',
facet_kws=dict(sharey=False, sharex=False)
)
基于Add mean and variability to seaborn FacetGrid distplots,我看到我可以定义一个FacetGrid
并映射一个函数。我可以将自定义函数传递给 displot
吗?
尝试直接使用 displot
的原因是这些图开箱即用更漂亮,无需调整刻度标签大小、轴标签大小等,并且在视觉上与我的其他图一致制作.
def specs(x, **kwargs):
ax = sns.histplot(x=x)
ax.axvline(x.mean(), color='k', lw=2)
ax.axvline(x.median(), color='k', ls='--', lw=2)
g = sns.FacetGrid(data=penguins, col='species')
g.map(specs,'body_mass_g' )
- 使用
FacetGrid
directly is not recommended. Instead, use other figure-level methods likeseaborn.displot
- 测试于
python 3.8.11
、pandas 1.3.2
、matplotlib 3.4.3
、seaborn 0.11.2
选项 1
- 使用
plt.
而不是ax
。- 在 OP 中,
vlines
将ax
用于histplot
,但在这里,图形是在.map
之前创建的。
- 在 OP 中,
penguins = sns.load_dataset("penguins")
g = sns.displot(
data=penguins, x='body_mass_g',
col='species',
facet_kws=dict(sharey=False, sharex=False)
)
def specs(x, **kwargs):
plt.axvline(x.mean(), c='k', ls='-', lw=2.5)
plt.axvline(x.median(), c='orange', ls='--', lw=2.5)
g.map(specs,'body_mass_g' )
选项 2
- 此选项更冗长,但更灵活,因为它允许从用于创建
displot
的数据源以外的数据源访问和添加信息。
import seaborn as sns
import pandas as pd
# load the data
pen = sns.load_dataset("penguins")
# groupby to get mean and median
pen_g = pen.groupby('species').body_mass_g.agg(['mean', 'median'])
g = sns.displot(
data=pen, x='body_mass_g',
col='species',
facet_kws=dict(sharey=False, sharex=False)
)
# extract and flatten the axes from the figure
axes = g.axes.flatten()
# iterate through each axes
for ax in axes:
# extract the species name
spec = ax.get_title().split(' = ')[1]
# select the data for the species
data = pen_g.loc[spec, :]
# print data as needed or comment out
print(data)
# plot the lines
ax.axvline(x=data['mean'], c='k', ls='-', lw=2.5)
ax.axvline(x=data['median'], c='orange', ls='--', lw=2.5)
两个选项的输出
资源
- 另请参阅以下 questions/answers 以了解向 seaborn FacetGrid 添加信息的其他方法
这里可以使用sns.FacetGrid.facet_data
迭代子图和底层数据的索引
这与 sns.FacetGrid.map
的工作原理很接近。 sns.FacetGrid.facet_data
是一个生成元组 (i, j, k)
的行、列、色调索引和 data
的数据帧,它是对应于每个方面的完整数据的子集。
import seaborn as sns
import pandas as pd
pen = sns.load_dataset("penguins")
# Set our x_var for later use
x_var = "body_mass_g"
g = sns.displot(
data=pen,
x=x_var,
col="species",
facet_kws=dict(sharey=False, sharex=False),
)
for (row, col, hue_idx), data in g.facet_data():
# Skip empty data
if not data.values.size:
continue
# Get the ax for `row` and `col`
ax = g.facet_axis(row, col)
# Set the `vline`s using the var `x_var`
ax.axvline(data[x_var].mean(), c="k", ls="-", lw=2.5)
ax.axvline(data[x_var].median(), c="orange", ls="--", lw=2.5)
输出: