python seaborn histplot和displot输出不匹配

brgchamk  于 2023-06-04  发布在  Python
关注(0)|答案(1)|浏览(214)
  • seaborn.histplotseaborn.displot生成的直方图不匹配。
  • sns.displot的默认图为kind='hist'
  • 使用python3.8.11seaborn 0.11.2matplotlib 3.4.2进行测试
    *为什么输出不匹配,如何解决?
  • 期望是,给定bins,相应图的density应该匹配。
  • bins传递给numpy.histogram_bin_edges
  • Visualizing distributions of data中包含的信息无法解决此问题。
import seaborn as sns
import matplotlib.pyplot as plt

# sample data: wide
dfw = sns.load_dataset("penguins", cache=False)[['bill_length_mm', 'bill_depth_mm']].dropna()

# sample data: long
dfl = dfw.melt(var_name='bill_size', value_name='vals')

seaborn.displot

1.忽略'sharex': False,但'sharey'可以工作
1.忽略bins

fg = sns.displot(data=dfl, x='vals', col='bill_size', kde=True, stat='density', bins=12, height=4, facet_kws={'sharey': False, 'sharex': False})
plt.show()

1.设置xlim不会产生差异

fg = sns.displot(data=dfl, x='vals', col='bill_size', kde=True, stat='density', bins=12, height=4, facet_kws={'sharey': False, 'sharex': False})
axes = fg.axes.ravel()
axes[0].set_xlim(25, 65)
axes[1].set_xlim(13, 26)
plt.show()

seaborn.histplot

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))

sns.histplot(data=dfw.bill_length_mm, kde=True, stat='density', bins=12, ax=ax1)
sns.histplot(data=dfw.bill_depth_mm, kde=True, stat='density', bins=12, ax=ax2)
fig.tight_layout()
plt.show()

更新

  • 正如mwaskom所建议的,common_bins=False将直方图变成相同的形状,解决了忽略binssharex的问题。然而,density似乎受到displot中地块数量的影响。
  • 如果displot中有3个地块,则密度为histplot中所示的1/3;对于2个小区,密度为1/2。

lb3vh1jj

lb3vh1jj1#

  • 正如mwaskom在评论中所建议的那样,common_bins=False将直方图变成相同的形状,解决了忽略binssharex的问题,并且分面图中的density由每个分面中的数据点数量而不是分面数量来缩放。
  • 使用common_norm=False解决了densitydisplot中的地块数拆分的问题

Plot Code

# displot
fg = sns.displot(data=dfl, x='vals', col='bill_size', kde=True, stat='density', bins=12, height=4,
                 facet_kws={'sharey': False, 'sharex': False}, common_bins=False, common_norm=False)

fg.fig.subplots_adjust(top=0.85)
fg.fig.suptitle('Displot with common_bins & common_norm as False')
plt.show()

# histplot
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))

sns.histplot(data=dfw.bill_length_mm, kde=True, stat='density', bins=12, ax=ax1)
sns.histplot(data=dfw.bill_depth_mm, kde=True, stat='density', bins=12, ax=ax2)

fig.subplots_adjust(top=0.85)
fig.suptitle('Histplot')

fig.tight_layout()
plt.show()

相关问题