Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 盒形图字典而不是列表?_Python_Matplotlib - Fatal编程技术网

Python 盒形图字典而不是列表?

Python 盒形图字典而不是列表?,python,matplotlib,Python,Matplotlib,假设我想创建一个列表的箱线图,其中包含大约一百万次的数字1-5 这样一份清单的大小约为5 000 000 000份,但以dict的形式表示,它完全不占用空间: s = {1: 1000000, 2: 1000000, 3: 1000000, 4: 1000000, 5:1000000} 问题是,如果我尝试创建该dict的箱线图,我会得到错误 Traceback (most recent call last): File "<pyshell#17>", line 1, in &l

假设我想创建一个列表的箱线图,其中包含大约一百万次的数字1-5

这样一份清单的大小约为5 000 000 000份,但以dict的形式表示,它完全不占用空间:

s = {1: 1000000, 2: 1000000, 3: 1000000, 4: 1000000, 5:1000000}
问题是,如果我尝试创建该dict的箱线图,我会得到错误

Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    ax.boxplot(s)
  File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/axes.py", line 5462, in boxplot
    if not hasattr(x[0], '__len__'):
KeyError: 0
但这导致了

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    boxplot(n for n, count in s.iteritems() for _ in xrange(count))
  File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/pyplot.py", line 2134, in boxplot
    ret = ax.boxplot(x, notch, sym, vert, whis, positions, widths, patch_artist, bootstrap)
  File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/axes.py", line 5462, in boxplot
    if not hasattr(x[0], '__len__'):
TypeError: 'generator' object has no attribute '__getitem__'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
箱线图(n表示n,s.iteritems()中的计数表示x范围中的u(计数))
文件“/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site packages/matplotlib/pyplot.py”,第2134行,方框图
ret=ax.箱线图(x、槽口、符号、垂直、whis、位置、宽度、贴片、引导)
文件“/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site packages/matplotlib/axes.py”,第5462行,方框图
如果不是hasattr(x[0],“\uuu len\uuu”):
TypeError:“生成器”对象没有属性“\uuuu getitem\uuuu”

据我所知,matplotlib没有用于此类数据的方法。基本上,您必须计算相关的统计数据,并实现自己绘制箱线图的方法。这可能会让您开始:

import matplotlib.pyplot as plt
import numpy as np


s = [{1: 1000000, 2: 1000000, 3: 1000000, 4: 1000000, 5:1000000},
     {1: 1000000, 0: 1000000, 8: 1000000, 3: 1000000, 7:1000000}]

def boxplot(data, x=0):

    sorted_data = np.array(data.items())
    sorted_data = np.sort(sorted_data, 0)
    values = sorted_data[:,0]
    freqs = sorted_data[:,1]
    freqs = np.cumsum(freqs)
    freqs = freqs*1./np.max(freqs)

    #get 25%, 50%, 75% percentiles
    idx = np.searchsorted(freqs, [0.25, 0.5, 0.75])
    p25, p50, p75 = values[idx]
    vmin, vmax = values.min(), values.max()

    ax = plt.gca()
    l,r = -0.2+x, 0.2+x
    #plot boxes
    plt.plot([l,r], [p50, p50], 'k')
    plt.plot([l, r, r, l, l], [p25, p25, p75, p75, p25], 'k')
    plt.plot([x,x], [p75, vmax], 'k')
    plt.plot([x,x], [p25, vmin], 'k')

for i in range(len(s)):
    boxplot(s[i],i)
plt.xlim(-0.5,1.5)
plt.show()

使用图片来描述数据的全部目的是为了获得对数据作为一个整体的感觉,而不是非常精确。所以 通过为每1000个实际数据点生成一个代表性数据点来压缩数据不会有太大的危害:

x = [val for val, num in s.items() for i in range(num//1000)]
这对肉眼来说应该足够好了:

import matplotlib.pyplot as plt
import numpy as np
s = {1: 1000000, 2: 1000000, 3: 1000000, 4: 1000000, 5:1000000}
x = [val for val, num in s.items() for i in range(num//1000)]
dct = plt.boxplot(x)
plt.show()

你能再解释一下你的数据吗?显然,你有许多相同数字的重复。它们是否都属于一个数据集(即,您想要一个或多个框?)。数据中还有其他数字吗?我有几本像s这样的字典,希望每本字典对应一个方框。这也是一个很好的答案,但由于更详细,我接受了另一本。我还是很感激你。一个好的、常识性的回答。
import matplotlib.pyplot as plt
import numpy as np
s = {1: 1000000, 2: 1000000, 3: 1000000, 4: 1000000, 5:1000000}
x = [val for val, num in s.items() for i in range(num//1000)]
dct = plt.boxplot(x)
plt.show()