【问题标题】:Plotting binned data with uneven bins用不均匀的 bin 绘制 binned 数据
【发布时间】:2017-07-01 23:23:01
【问题描述】:

我有一个数据集,我已经设法将其分成 250 个间隔,但我很难正确地绘制这些值。我看过了

python plot simple histogram given binned data

How to make a histogram from a list of data

但就我而言,我得到的只是一条垂直线。

作为参考,我的分箱数据如下所示:

(0, 250]                2
(250, 500]              1
(500, 750]              5
(750, 1000]            13
(1000, 1250]           77
(1250, 1500]          601
(1500, 1750]         1348
(1750, 2000]         3262
(2000, 2250]         3008
(2250, 2500]         5118
(2500, 2750]         4576
(2750, 3000]         5143
(3000, 3250]         3509
(3250, 3500]         4390
(3500, 3750]         2749
(3750, 4000]         2794
(4000, 4250]         1391
(4250, 4500]         1753
(4500, 4750]         1099
(4750, 5000]         1592
(5000, 5250]          688
(5250, 5500]          993
(5500, 5750]          540
(5750, 6000]          937
(6000, 6250]          405
(6250, 6500]          572
(6500, 6750]          202
(6750, 7000]          369
(7000, 7250]          164
(7250, 7500]          231
                     ... 
(7750, 8000]          285
(8000, 8250]           55
(8250, 8500]          116
(8500, 8750]           29
(8750, 9000]          140
(9000, 9250]           31
(9250, 9500]           68
(9500, 9750]           20
(9750, 10000]         132
(10000, 10250]         15
(10250, 10500]         29
(10500, 10750]         21
(10750, 11000]         73
(11000, 11250]         26
(11250, 11500]         36
(11500, 11750]         21
(11750, 12000]         74
(12000, 12250]          5
(12250, 12500]         50
(12500, 12750]         13
(12750, 13000]         34
(13000, 13250]          4
(13250, 13500]         45
(13500, 13750]         14
(13750, 14000]         53
(14000, 14250]          6
(14250, 14500]         17
(14500, 14750]          7
(14750, 15000]         79
(15000, 10000000]     256

最后一个区间包含大于 15,000 的所有值。我已将上述值放在 list 中,然后尝试绘制:

bins = [i for i in range(0, 15001, 250)]
bins.append(10000000)
categories = pd.cut(data["price"], bins)
price_binned = list(pd.value_counts(categories).reindex(categories.cat.categories))
plt.hist(price_binned)

生成一个包含 12 个 bin 的直方图。添加bin 参数

plt.hist(price_binned, bins=(bin_num+1)) 

生成一个直方图,其中左侧有一条非常高的垂直线。最后,我正在考虑添加plt.xticks(bins),但后来我得到了一个没有产生任何结果的图表。

我是否可以生成一个直方图,其中 x 轴是 bin 值,y 轴是 bin 中的值?

使用plt.bar()

使用不带 bin 参数的 plt.hist()

plt.hist() 与 bin=bins 一起使用

使用seaborn

【问题讨论】:

  • 您显示的数据已经是直方图。因此,目前还不清楚您的目标是什么。
  • 我想要数据的可视化表示,而不是仅仅将其作为列表
  • 当然,但是视觉表示与您已有的直方图中应该有什么不同?
  • 如果您的数据已经是直方图形式,那么您应该能够使用 pyplot.bar() 图表并将 bins 列表传递给 tick_label 参数

标签: python matplotlib plot


【解决方案1】:

您遇到的主要问题似乎是您要求plt.hist()sns.distplot() 为您的预分箱直方图数据创建直方图。

您可以使用条形图来帮助您使用 price_binned 变量自定义分箱方案,如下所示:

fig, ax = plt.subplots(1, 1)
ax.bar(range(len(bins)), price_binned, width=1, align='center')
ax.set_xticklabels([x + 125 for x in bins[:-1]])
plt.show()

我使用中点值作为每个 bin 的标签。这可以换成您喜欢的任何其他 xtick 标签符号。

这是我使用(大部分)您的数据得到的结果(有些数据丢失了): result.

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多