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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 05:15:31  来源:igfitidea点击:

How to make a histogram from a list of data

pythonmatplotliberror-handling

提问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 arangefor a fixed bin size (or Python's standard range object), and NumPy's linspacefor 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()

enter image description here

在此处输入图片说明

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()

enter image description here

在此处输入图片说明