【问题标题】:How to draw distribution plot for discrete variables in seaborn如何在seaborn中绘制离散变量的分布图
【发布时间】:2018-08-06 00:47:17
【问题描述】:

当我为离散变量绘制displot 时,分布可能不像我想的那样。例如。

我们可以发现barplot中存在裂缝,因此kdeplot中的曲线在y轴上“较低”。

在我的工作中,情况更糟:

我认为这可能是因为每个条的“宽度”或“重量”不是 1。但是我没有找到任何可以证明它的参数。

我想画这样的曲线(应该更平滑)

【问题讨论】:

  • 我会说这两个情节看起来都很合理。你到底想改变什么?
  • @ImportanceOfBeingErnest 谢谢。我已经更新了问题,你可以看到我想要的。
  • 我明白了。因此, distplot 产生的内核密度估计可能不是您所追求的。也许宁愿手动合并数据并绘制绿线是您想要的。然后,您还可以使用高斯滤波器左右平滑线条。
  • @ImportanceOfBeingErnest 是的。以前我使用类似 sigmoid 的曲线手动拟合它们(这比 seaborn 中内置的正态分布要好)。但是,这不是我的帖子的意图。

标签: python matplotlib seaborn probability-distribution


【解决方案1】:

如果问题是直方图中有一些空的 bin,那么指定 bin 以匹配数据可能是有意义的。在这种情况下,请使用bins=np.arange(0,16) 获取数据中所有整数的 bin。

import numpy as np; np.random.seed(1)
import matplotlib.pyplot as plt
import seaborn as sns

n = np.random.randint(0,15,10000)
sns.distplot(n, bins=np.arange(0,16), hist_kws=dict(ec="k"))

plt.show()

【讨论】:

    【解决方案2】:

    解决此问题的一种方法可能是调整 KDE 的“带宽” (see the documentation for seaborn.kdeplot())

    n = np.round(np.random.normal(5,2,size=(10000,)))
    sns.distplot(n, kde_kws={'bw':1})
    

    编辑这是条形图和 KDE 的不同比例的替代方法

    n = np.round(np.random.normal(5,2,size=(10000,)))
    fig, ax1 = plt.subplots()
    ax2 = ax1.twinx()
    
    sns.distplot(n, kde=False, ax=ax1)
    sns.distplot(n, hist=False, ax=ax2, kde_kws={'bw':1})
    

    【讨论】:

    • 图片没那么“漂亮”。我想知道我是否可以让离散变量的密度为 1,这样它们的面积会更大,“kde 曲线”会和条形一样高。
    • 这取决于您要达到的目标。如果它只是为了显示目的,那么你可以做任何你想要的缩放。我编辑了我的答案以提出一个将 KDE 缩放到条形高度的解决方案
    • @Zealseeker 也许您想指定bins 等于您正在绘制的变量的唯一值数(最后是离散的)。这样我得到了更宽更好的直方图条。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2012-06-27
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多