Seaborn:如何将每个分类值的 Y 轴缩放到 100%

Posted

技术标签:

【中文标题】Seaborn:如何将每个分类值的 Y 轴缩放到 100%【英文标题】:Seaborn: How to scale Y axis to 100 percent for each categorical value 【发布时间】:2022-01-11 00:26:26 【问题描述】:

目标:

我想创建PaperlessBilling 分类特征(电信客户流失数据集)的堆栈直方图,将 Y 轴显示为百分比,并将流失分布显示为色调。但是,百分比不是累积计算的。

如果使用 R,这就是我所期望的:

ggplot(Churn, aes(SeniorCitizen, fill = Churn)) +
  geom_bar(position = "fill") +
  xlab("Senior Citizen status") +
  ylab("Percent") +
  scale_y_continuous(labels = scales::percent) +
  scale_x_discrete(labels = c("Non-Senior Citizens", "Senior Citizens")) +
  scale_fill_manual(name = "Churn Status", values = c("green2", "red1"), labels = c("No", "Yes")) +
  ggtitle("The Ratio of Churns by Senior Citizen status") +
  theme_classic() +
  theme(legend.position = "bottom",
        plot.title = element_text(hjust = 0.5, size = 15))

这是上面代码的输出(看到两个类别的总和都是100%):

这是我所做的:

fig, axs = plt.subplots(figsize=(5, 5))

sns.histplot(
    df,
    x = "PaperlessBilling",
    hue = "Churn",
    multiple = "stack",
    stat = "percent"
)

这是上面代码的输出:

【问题讨论】:

@JohanC 是的,总和是 100。但我想像绿红色那样显示。每个分类都是 100 【参考方案1】:

对于stat="percent",所有条形的总和为100。要使属于同一 x 值的条形总和为 100,您可以使用 multiple='fill'。请注意,在后一种情况下,总和为1.0PercentFormatter 将 y 轴显示为百分比。

import matplotlib.pyplot as plt
from matplotlib.ticker import PercentFormatter
import seaborn as sns
import pandas as pd
import numpy as np

df = pd.DataFrame("PaperlessBilling": np.random.choice(['Yes', 'No'], p=[.6, .4], size=2000))
df["Churn"] = np.where(df["PaperlessBilling"] == 'Yes',
                       np.random.choice(['Yes', 'No'], p=[.3, .7], size=2000),
                       np.random.choice(['Yes', 'No'], p=[.1, .9], size=2000))
df["PaperlessBilling"] = pd.Categorical(df["PaperlessBilling"], ['Yes', 'No'])  # fix an order
df["Churn"] = pd.Categorical(df["Churn"], ['No', 'Yes'])  # fix an order

palette = 'Yes': 'crimson', 'No': 'limegreen'
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(10, 5))

sns.histplot(df, x="PaperlessBilling", hue="Churn", palette=palette, alpha=1,
             multiple="stack", stat="percent", ax=ax1)
ax1.yaxis.set_major_formatter(PercentFormatter(100))

sns.histplot(df, x="PaperlessBilling", hue="Churn", palette=palette, alpha=1,
             multiple="fill", ax=ax2)
ax2.yaxis.set_major_formatter(PercentFormatter(1))
sns.despine()
plt.tight_layout()
plt.show()

【讨论】:

以上是关于Seaborn:如何将每个分类值的 Y 轴缩放到 100%的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn facetgrid将逗号添加到y轴标签[重复]

将R ggplot中直方图中的y轴标准化为比例

将y轴自动缩放到pyqtgraph中的可见数据

如何在 seaborn FacetGrid 中格式化 y 轴或 x 轴标签

如何使用 x 轴作为“日期”的 seaborn 实现 Lineplot

如何在三元图中的刻度上而不是 x 和 y 轴上进行缩放