首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于matplotlib的离散值直方图

基于matplotlib的离散值直方图
EN

Stack Overflow用户
提问于 2015-05-07 22:01:11
回答 4查看 39.8K关注 0票数 29

有时,我不得不用matplotlib直方图离散值。在这种情况下,选择二进制可能是至关重要的:如果您使用10桶直方图0、1、2、3、4、5、6、7、8、9、10,那么其中一个回收箱的数量将是其他的两倍。在其他术语中,绑定大小通常应该是离散化大小的倍数。

虽然这个简单的例子比较容易自己处理,但是是否有一个指向库/函数的指针可以自动处理这个问题,包括浮点数据,其中离散化的大小可能由于FP四舍五入而略有变化?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-08 10:08:45

考虑到你问题的标题,我假设离散化的大小是恒定的。

您可以找到这个离散化大小(或者至少严格地说,n是这个大小的一倍,因为您的数据中可能没有两个相邻的样本)

代码语言:javascript
复制
np.diff(np.unique(data)).min()

这会在您的数据(np.unique)中找到唯一的值,找出当时(np.diff)之间的差异。唯一是必需的,这样你就不会得到零值。然后找出最小的差别。在离散化常数非常小的情况下,可能会出现问题--我将回到这个问题上。

接下来--您希望值位于bin的中间--您当前的问题是,9和10都位于matplotlib自动提供的最后一个bin的边缘,因此在一个bin中可以得到两个样本。

所以-试试这个:

代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np

data = range(11)
data = np.array(data)

d = np.diff(np.unique(data)).min()
left_of_first_bin = data.min() - float(d)/2
right_of_last_bin = data.max() + float(d)/2
plt.hist(data, np.arange(left_of_first_bin, right_of_last_bin + d, d))
plt.show()

这意味着:

小非整数离散化

我们可以多做一些测试数据集。

代码语言:javascript
复制
import random 

data = []
for _ in range(1000):
    data.append(random.randint(1,100))
data = np.array(data)
nasty_d = 1.0 / 597 #Arbitrary smallish discretization
data = data * nasty_d

如果您然后在上面的数组中运行它,并查看代码所吐出的d,您将看到

打印(Nasty_d) 0.0016750418760469012 >>>打印(D) 0.00167504187605

因此,d的检测值不是数据创建时使用的nasty_d的“真实”值。然而--用将d的一半移动到中间值的技巧,这并不重要,,除非您的离散化非常小,所以在浮动的精度限制范围内,您有1000 s的回收箱,检测到的d和“真正的”离散化之间的区别可以达到这样的程度,即其中一个垃圾箱“错过”了数据点。这是需要注意的事情,但很可能不会打到你。

上面的一个例子是

非均匀离散/最合适的垃圾箱..。

对于更复杂的情况,您可能想看看我发现这篇博文。在开发自己的贝叶斯动态规划方法之前,参考多个标准技术(如斯特奇斯规则与弗里德曼与狄科尼斯规则 ),从(连续/准连续)数据中自动“学习”最佳装箱宽度的方法。

如果这是您的用例--这个问题要广泛得多,可能不适合在堆栈溢出的情况下给出明确的答案,尽管希望链接会有所帮助。

票数 32
EN

Stack Overflow用户

发布于 2018-10-27 01:16:44

也许这是一个比理查德·斯内普更不完整的答案,但这是我最近学到的,而且我发现了直观和简单的答案。

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt

# great seed
np.random.seed(1337)

# how many times will a fair die land on the same number out of 100 trials.
data = np.random.binomial(n=100, p=1/6, size=1000)

# the trick is to set up the bins centered on the integers, i.e.
# -0.5, 0.5, 1,5, 2.5, ... up to max(data) + 1.5. Then you substract -0.5 to
# eliminate the extra bin at the end.
bins = np.arange(0, data.max() + 1.5) - 0.5

# then you plot away
fig, ax = plt.subplots()
_ = ax.hist(data, bins)
ax.set_xticks(bins + 0.5)

原来,大约16/100的投篮将是相同的数字!

票数 20
EN

Stack Overflow用户

发布于 2021-03-25 20:28:50

不完全是OP要求的,但如果所有值都是整数,则不需要计算回收箱。

np.unique(d, return_counts=True)返回作为第一个元素的唯一值列表的元组,并将其计数作为第二个元素。可以使用星型运算符直接插入plt.bar(x, height)

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt

d = [1,1,2,4,4,4,5,6]
plt.bar(*np.unique(d, return_counts=True))

这样做的结果如下:

注意,这在技术上也适用于浮点数,但是结果可能是意外的,因为每个数字都会创建一个条形条。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30112420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档