Python 如何从数据列表制作直方图
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/24809757/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to make a histogram from a list of data
提问by Wana_B3_Nerd
Well I think matplotlib got downloaded but with my new script I get this error:
好吧,我认为 matplotlib 已下载,但使用我的新脚本时出现此错误:
/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
And my code is: #!/usr/bin/python
我的代码是:#!/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()
But the code thats getting me the error is the new addition that I added which is the last part, reproduced below:
但是让我出错的代码是我添加的新添加内容,这是最后一部分,转载如下:
data = dp
num_bins = 200 # <- number of bins for the histogram
plt.hist(data, num_bins)
plt.show()
采纳答案by Wana_B3_Nerd
do you have any idea how to make 200 evenly spaced out bins, and have your program store the data in the appropriate bins?
您知道如何制作 200 个均匀间隔的垃圾箱,并让您的程序将数据存储在适当的垃圾箱中吗?
You can, for example, use NumPy's arange
for a fixed bin size (or Python's standard range object), and NumPy's linspace
for evenly spaced bins. Here are 2 simple examples from my matplotlib gallery
例如,您可以将 NumPyarange
用于固定 bin 大小(或 Python 的标准范围对象),将 NumPylinspace
用于均匀间隔的 bin。这是我的matplotlib 库中的 2 个简单示例
Fixed bin size
固定箱尺寸
import numpy as np
import random
from matplotlib import pyplot as plt
data = np.random.normal(0, 20, 1000)
# fixed bin size
bins = np.arange(-100, 100, 5) # fixed bin size
plt.xlim([min(data)-5, max(data)+5])
plt.hist(data, bins=bins, alpha=0.5)
plt.title('Random Gaussian data (fixed bin size)')
plt.xlabel('variable X (bin size = 5)')
plt.ylabel('count')
plt.show()
Fixed number of bins
固定数量的垃圾箱
import numpy as np
import math
from matplotlib import pyplot as plt
data = np.random.normal(0, 20, 1000)
bins = np.linspace(math.ceil(min(data)),
math.floor(max(data)),
20) # fixed number of bins
plt.xlim([min(data)-5, max(data)+5])
plt.hist(data, bins=bins, alpha=0.5)
plt.title('Random Gaussian data (fixed number of bins)')
plt.xlabel('variable X (20 evenly spaced bins)')
plt.ylabel('count')
plt.show()