#python #r #seaborn #histogram
#python #r #сиборн #гистограмма
Вопрос:
Цель:
Я хочу создать гистограмму стека PaperlessBilling
категориального признака (набор данных об оттоке клиентов Telco), отобразить ось 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"
)
Это результат приведенного выше кода:
Комментарии:
1. @JohanC да, сумма равна 100. Но я хочу, чтобы он отображался как зелено-красный. Каждая из категорий равна 100
Ответ №1:
При stat="percent"
этом все столбцы суммируются до 100
. Чтобы столбцы, принадлежащие одному и тому же значению x, суммировались до 100
, вы можете использовать multiple='fill'
. Обратите внимание, что в последнем случае сумма равна 1.0
. Ось PercentFormatter
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()