首页 > 解决方案 > 在条形图上绘制分布数据

问题描述

我有一个包含频率的大字典,如下所示:

frequency = {3: 231, 6: 373, 8: 455}

其中字典键表示句子的长度,值表示具有该长度的句子数。

我创建了这样的条形图:

fig, ax = plt.subplots()
ax.bar(list(frequency.keys()), frequency.values(), log=True, color='g', width=0.5)
ax.set_title('DISTRIBUTION OF SENTENCE LENGTH')
ax.set_xlabel('Sentence length')
ax.set_ylabel('Frequency')
plt.show()

结果是正确的,如下所示:

在此处输入图像描述

现在我想做的是绘制这些值的分布。像这样的东西:

在此处输入图像描述

我能怎么做?我已经尝试关注这个帖子(以及其他类似的帖子),但效果不佳。谢谢!

标签: pythonpython-3.xmatplotlibbar-chart

解决方案


在seaborn中histplot有一个weights参数。它还允许添加一个kde. 默认带宽似乎有点太宽了,可以通过kde_kws={'bw_adjust': 0.3}. 使用discrete=True时,直方图箱适用于离散值。

这是一个例子:

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

frequencies = {1: 2000}
for i in range(2, 10):
    frequencies[i] = int(frequencies[i - 1] * np.random.uniform(1.02, 1.1))
for i in range(10, 500):
    frequencies[i] = int(frequencies[i - 1] * np.random.uniform(0.97, 0.99))
    if frequencies[i] == 0:
        break

ax = sns.histplot(x=frequencies.keys(), weights=frequencies.values(), discrete=True,
                  kde=True, kde_kws={'bw_adjust': 0.2}, line_kws={'linewidth': 3})
ax.margins(x=0.01)
plt.show()

示例图


推荐阅读