我已经安装了matplotlib,并尝试从一些数据创建直方图:
#!/usr/bin/python
l = []
with open("testdata") as f:
line = f.next()
f.next() # skip headers
nat = int(line.split()[0])
print nat
for line in f:
if line.strip():
if line.strip():
l.append(map(float,line.split()[1:]))
b = 0
a = 1
for b in range(53):
for a in range(b+1, 54):
import operator
import matplotlib.pyplot as plt
import numpy as np
vector1 = (l[b][0], l[b][1], l[b][2])
vector2 = (l[a][0], l[a][1], l[a][2])
x = vector1
y = vector2
vector3 = list(np.array(x) - np.array(y))
dotProduct = reduce( operator.add, map( operator.mul, vector3, vector3))
dp = dotProduct**.5
print dp
data = dp
num_bins = 200 # <- number of bins for the histogram
plt.hist(data, num_bins)
plt.show()
代码的最后一部分出现错误:
/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_gtk.py:621: DeprecationWarning: Use the new widget gtk.Tooltip
self.tooltips = gtk.Tooltips()
Traceback (most recent call last):
File "vector_final", line 42, in <module>
plt.hist(data, num_bins)
File "/usr/lib64/python2.6/site-packages/matplotlib/pyplot.py", line 2008, in hist
ret = ax.hist(x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, **kwargs)
File "/usr/lib64/python2.6/site-packages/matplotlib/axes.py", line 7098, in hist
w = [None]*len(x)
TypeError: len() of unsized object
但是不管怎样,你知道如何制作200个均匀分布的bin,并让你的程序将数据存储在适当的bin中吗?
3条答案
按热度按时间slsn1g291#
你知道如何制作200个均匀分布的bin,并让你的程序将数据存储在适当的bin中吗?
例如,可以使用NumPy的
arange
表示固定大小的bin(或者Python的标准range对象),使用NumPy的linspace
表示等间距的bin。固定箱大小
固定的箱数
pieyvz9o2#
自动收集箱
如何创建200个均匀分布的bin,并让程序将数据存储在适当的bin中?
接受的答案手动创建了200个带有
np.arange
和np.linspace
的条柱,但matplotlib已经自动完成了这一操作:1.####
plt.hist
本身返回计数和bin或者,如果在打印前需要存储箱:
1.####
np.histogram
与plt.stairs
的关系1.####
pd.cut
与plt.hist
的组合63lcw9qa3#
有几种方法可以做到这一点。
如果你不能保证你的项目都是相同的类型和数值,那么使用内置的标准库
collections
:否则,如果你的数据保证都是相同的类型和数值,那么使用Python模块
numpy
:numpy直方图功能实际上是凯迪拉克的选择,因为
np.histogram
可以尝试计算您需要多少个bin,它可以进行加权,它使用的所有算法都有大量优秀的文档和示例代码。