python - 在条形图上绘制分布数据
问题描述
我有一个包含频率的大字典,如下所示:
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()
结果是正确的,如下所示:
现在我想做的是绘制这些值的分布。像这样的东西:
我能怎么做?我已经尝试关注这个帖子(以及其他类似的帖子),但效果不佳。谢谢!
解决方案
在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()
推荐阅读
- php - laravel 护照 api 认证
- angular - Angular 4 ngModel不适用于多个for循环中的复选框
- css - 物化 css 1.0 嵌套下拉菜单
- eclipse - eclipse中的程序执行太慢了,昨天同一程序的执行速度很快
- c# - 如何调用,API 中的 POST 方法,其中包含一个类 Content
- spring - How to config JPA in spring mvc?
- pentaho - 为什么我在 pentaho cde 中传递日期参数时看不到示例数据图表?
- reactjs - reactjs链接不起作用,在ajax请求后渲染时
- netsuite - 通过 Suitelet 使用 Netsuite 信用卡付款
- primefaces - 在 Primefaces 数据表单元格编辑器中选择每个项目上的选择行复选框