[英]Seaborn distplot errors when generating histograms for single-element series
When I use seaborn's distplot (in 0.7.1) to visualize a histogram, I get an error if the input series contains only a single element. 当我使用seaborn的distplot (在0.7.1中)可视化直方图时,如果输入系列仅包含单个元素,则会出现错误。 In other words, something like
换句话说,就像
import numpy as np
import seaborn as sns
num_elements = 1000
sns.distplot(np.random.normal(10, 1, num_elements))
works beautifully but if I set num_elements
to 1 I get the following error: 工作
num_elements
漂亮,但如果我将num_elements
设置为1,我会收到以下错误:
In [8]: num_elements = 1
In [9]: sns.distplot(np.random.normal(10, 1, num_elements))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-35e3f8293582> in <module>()
----> 1 sns.distplot(np.random.normal(10, 1, num_elements))
/usr/local/lib/python2.7/site-packages/seaborn/distributions.pyc in distplot(a, bins, hist, kde, rug, fit, hist_kws, kde_kws, rug_kws, fit_kws, color, vertical, norm_hist, axlabel, label, ax)
207 if hist:
208 if bins is None:
--> 209 bins = min(_freedman_diaconis_bins(a), 50)
210 hist_kws.setdefault("alpha", 0.4)
211 hist_kws.setdefault("normed", norm_hist)
/usr/local/lib/python2.7/site-packages/seaborn/distributions.pyc in _freedman_diaconis_bins(a)
28 # From http://stats.stackexchange.com/questions/798/
29 a = np.asarray(a)
---> 30 h = 2 * iqr(a) / (len(a) ** (1 / 3))
31 # fall back to sqrt(a) bins if iqr is 0
32 if h == 0:
TypeError: len() of unsized object
After poking around the source a bit, I found that I could avoid this error by specifying the number of bins. 在稍微探讨了源代码之后,我发现通过指定bin的数量可以避免这个错误。 But that opens me up to another one:
但这让我开启了另一个:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-10-6e6569de737a> in <module>()
----> 1 sns.distplot(np.random.normal(10, 1, num_elements), bins=10)
/usr/local/lib/python2.7/site-packages/seaborn/distributions.pyc in distplot(a, bins, hist, kde, rug, fit, hist_kws, kde_kws, rug_kws, fit_kws, c\olor, vertical, norm_hist, axlabel, label, ax)
213 hist_color = hist_kws.pop("color", color)
214 ax.hist(a, bins, orientation=orientation,
--> 215 color=hist_color, **hist_kws)
216 if hist_color != color:
217 hist_kws["color"] = hist_color
/usr/local/lib/python2.7/site-packages/matplotlib/__init__.pyc in inner(ax, *args, **kwargs)
1817 warnings.warn(msg % (label_namer, func.__name__),
1818 RuntimeWarning, stacklevel=2)
-> 1819 return func(ax, *args, **kwargs)
1820 pre_doc = inner.__doc__
1821 if pre_doc is None:
/usr/local/lib/python2.7/site-packages/matplotlib/axes/_axes.pyc in hist(self, x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs)
5933 x = np.array([[]])
5934 else:
-> 5935 x = _normalize_input(x, 'x')
5936 nx = len(x) # number of datasets
5937
/usr/local/lib/python2.7/site-packages/matplotlib/axes/_axes.pyc in _normalize_input(inp, ename)
5875 else:
5876 raise ValueError(
-> 5877 "{ename} must be 1D or 2D".format(ename=ename))
5878 if inp.shape[1] < inp.shape[0]:
5879 warnings.warn(
ValueError: x must be 1D or 2D
What's going on here? 这里发生了什么? Is there some workaround I can use to force seaborn to plot a histogram for this single element series?
是否有一些解决方法可以用来强制seaborn为这个单个元素系列绘制直方图? For context, I need this because I'm plotting multiple histograms, describing different conditions, on a shared axis.
对于上下文,我需要这个,因为我在共享轴上绘制多个直方图,描述不同的条件。 In some cases, there might be only a single element in that condition, yet I ought to be able to plot just the one bar!
在某些情况下,在这种情况下可能只有一个元素,但我应该只能绘制一个条形图!
You can trick seaborn
when the array length is 1 by duplicating the value: 通过复制值,您可以在数组长度为1时欺骗
seaborn
:
rs = np.random.RandomState(0)
num_elements = 1
x = rs.normal(10, 1, num_elements)
sns.distplot(np.r_[x, x], kde=False, norm_hist=True)
Or if you don't need the goodies provided by seaborn (most of them doesn't make sense for a single element) just use matplotlib or pandas: 或者,如果您不需要seaborn提供的好东西(大多数对单个元素没有意义),只需使用matplotlib或pandas:
plt.hist(x, bins=1)
pd.Series(x).hist(bins=1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.