![](/img/trans.png)
[英]How to plot percentage with seaborn distplot / histplot / displot
[英]How to plot groupby as percentage in seaborn?
我有一個二進制分類問題,我想用RandomForestClassifier解決它。 我的目標列是'成功',它是0或1.我想調查數據,看看它是什么樣的。 為此,我嘗試按類別計算情節。 但並不是說總數的百分比是“成功的”(即成功== 1)
如何更改以下圖表,以便這些子圖顯示所有帖子總數(成功== 1)的百分比? (假設在工作日的類別中,在'星期六'那天我有10個數據點,其中7個是成功的('成功'== 1),所以我想在那天有一個點數為0.7的酒吧。
這是實際的情節(計數: - /):
這是我的數據幀的一部分:
以下是用於生成實際情節的實際代碼:
# Plot
sns.set(style="darkgrid")
x_vals = [['page_name', 'weekday'],['type', 'industry']]
subtitles = [['by Page', 'by Weekday'],['by Content Type', 'by Industry']]
fig, ax = plt.subplots(2,2, figsize=(15,10))
#jitter = [[False, 1], [0.5, 0.2]]
for j in range(len(ax)):
for i in range(len(ax[j])):
ax[j][i].tick_params(labelsize=15)
ax[j][i].set_xlabel('label', fontsize=17, position=(.5,20))
if (j == 0) :
ax[j][i].tick_params(axis="x", rotation=50)
ax[j][i].set_ylabel('label', fontsize=17)
ax[j][i] = sns.countplot(x=x_vals[j][i], hue="successful", data=mainDf, ax=ax[j][i])
for j in range(len(ax)):
for i in range(len(ax[j])):
ax[j][i].set_xlabel('', fontsize=17)
ax[j][i].set_ylabel('count', fontsize=17)
ax[j][i].set_title(subtitles[j][i], fontsize=18)
fig.suptitle('Success Count by Category', position=(.5,1.05), fontsize=20)
fig.tight_layout()
fig.show()
PS:請不要,我正在使用Seaborn。 如果可能的話,解決方案也應該是Seaborn。 謝謝!
你可以在這里使用barplot
。 我不是100%確定你真正想要實現的目標,所以我開發了幾種解決方案。
成功(不成功)每次成功的頻率(不成功)
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
mainDf['frequency'] = 0 # a dummy column to refer to
for col, ax in zip(['page_name', 'weekday', 'type', 'industry'], axes.flatten()):
counts = mainDf.groupby([col, 'successful']).count()
freq_per_group = counts.div(counts.groupby('successful').transform('sum')).reset_index()
sns.barplot(x=col, y='frequency', hue='successful', data=freq_per_group, ax=ax)
每組成功(不成功)的頻率
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
mainDf['frequency'] = 0 # a dummy column to refer to
for col, ax in zip(['page_name', 'weekday', 'type', 'industry'], axes.flatten()):
counts = mainDf.groupby([col, 'successful']).count()
freq_per_group = counts.div(counts.groupby(col).transform('sum')).reset_index()
sns.barplot(x=col, y='frequency', hue='successful', data=freq_per_group, ax=ax)
根據您提供的數據,給出
每次成功(不成功)的頻率
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
mainDf['frequency'] = 0 # a dummy column to refer to
total = len(mainDf)
for col, ax in zip(['page_name', 'weekday', 'type', 'industry'], axes.flatten()):
counts = mainDf.groupby([col, 'successful']).count()
freq_per_total = counts.div(total).reset_index()
sns.barplot(x=col, y='frequency', hue='successful', data=freq_per_total, ax=ax)
將行ax[j][i] = sns.countplot(x=x_vals[j][i], hue="successful", data=mainDf, ax=ax[j][i])
更改為ax[j][i] = sns.barplot(x=x_vals[j][i], y='successful', data=mainDf, ax=ax[j][i], ci=None, estimator=lambda x: sum(x) / len(x) * 100)
你的代碼就是
sns.set(style="darkgrid")
x_vals = [['page_name', 'weekday'],['type', 'industry']]
subtitles = [['by Page', 'by Weekday'],['by Content Type', 'by Industry']]
fig, ax = plt.subplots(2,2, figsize=(15,10))
#jitter = [[False, 1], [0.5, 0.2]]
for j in range(len(ax)):
for i in range(len(ax[j])):
ax[j][i].tick_params(labelsize=15)
ax[j][i].set_xlabel('label', fontsize=17, position=(.5,20))
if (j == 0) :
ax[j][i].tick_params(axis="x", rotation=50)
ax[j][i].set_ylabel('label', fontsize=17)
ax[j][i] = sns.barplot(x=x_vals[j][i], y='successful', data=mainDf, ax=ax[j][i], ci=None, estimator=lambda x: sum(x) / len(x) * 100)
for j in range(len(ax)):
for i in range(len(ax[j])):
ax[j][i].set_xlabel('', fontsize=17)
ax[j][i].set_ylabel('percent', fontsize=17)
ax[j][i].set_title(subtitles[j][i], fontsize=18)
fig.suptitle('Success Percentage by Category', position=(.5,1.05), fontsize=20)
fig.tight_layout()
fig.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.