如何将 seaborn displot 的 y 轴显示为百分比

How to show the y-axis of seaborn displot as percentage

我正在使用 seaborn.displot 显示一组参与者的分数分布。

是否可以让 y 轴显示实际百分比(如下例)?

这是受众对数据的要求。 目前它是在 excel 中完成的,但在 python 中会更有用。

import seaborn as sns

data = sns.load_dataset('titanic')

p = sns.displot(data=data, x='age', hue='sex', height=4, kind='kde')

所需格式

  • seaborn.displot is a figure-level plot providing access to several approaches for visualizing the univariate or bivariate distribution of data (histplot, kdeplot, ecdfplot)
  • How to plot percentage with seaborn distplot / histplot / displot
  • common_binscommon_norm的设置有关。
  • 测试于 python 3.8.12pandas 1.3.4matplotlib 3.4.3seaborn 0.11.2
    • data 是 pandas 数据框,seabornmatplotlib.
    • 的 API

kind='hist': seaborn.histplot

  • 使用 stat='percent'seaborn 0.11.2
  • 可用
import seaborn as sns
from matplotlib.ticker import PercentFormatter

data = sns.load_dataset('titanic')

p = sns.displot(data=data, x='age', stat='percent', hue='sex', height=4, kde=True, kind='hist')

请不要执行以下操作,如说明的那样

kind='kde': seaborn.kdeplot

  • 根据 mwaskomseaborn 的创建者:您可以将百分比格式化程序包裹在密度值周围(如以下代码所示),但这是不正确的,因为密度不是比例(您最终可能会得到 > 100% 的值)。
  • 根据 JohanC, you can't view the y-axis as a percentage, it is a density。密度可以任意高或低,具体取决于 x 轴。 将其格式化为百分比是错误的。
  • 我会把这个作为答案的一部分留下来作为解释,否则只会被别人贴出来。
  • 使用matplotlib.ticker.PercentFormatter转换轴值。
import seaborn as sns
from matplotlib.ticker import PercentFormatter

data = sns.load_dataset('titanic')

p = sns.displot(data=data, x='age', hue='sex', height=3, kind='kde')

p.axes.flat[0].yaxis.set_major_formatter(PercentFormatter(1))

如@JohanC 所述,KDE 的 y 轴是 density,而不是比例,因此将其转换为百分比没有意义。

你有两个选择。一种是在直方图上绘制 KDE 曲线,直方图计数以百分比表示:

sns.displot(
    data=tips, x="total_bill", hue="sex",
    kind="hist", stat="percent", kde=True,
)

但是您的“所需图”实际上看起来根本不像密度,它看起来像是用直线而不是条形图绘制的直方图。你可以用 element="poly":

sns.displot(
    data=tips, x="total_bill", hue="sex",
    kind="hist", stat="percent", element="poly", fill=False,
)