2017-03-26 9 views
1

データフレームのサブセットをプロットしていますが、1つのサブセットには1行しかありません。これが問題を引き起こす原因について私が考えることができる唯一の理由です。これは、次のようになります。1行でデータフレームにsns.distplot()を使用した場合のエラー

problem_dataframe = prob_df[prob_df['Date']==7] 
problem_dataframe.head() 

enter image description here

私がやろう:

sns.distplot(problem_dataframe['floatTime']) 

しかし、私はエラーを取得する:

TypeError: len() of unsized object

誰かが何だ教えてくださいだろうこの原因とそれを回避する方法は?

+0

なぜ値が1つだけの場合に分布をプロットしたいのですか? – Peaceful

+0

これは月の毎日の多くのサブプロットの1つで、その日はただ1つのエントリしか持たない – Austin

+0

完全なスタックトレースを表示する必要があります。それは、誰か(あるいはあなたが知っている人、おそらくあなたが知っている人)が問題を診断するのに役立つ貴重な情報を含んでいます。 – mwaskom

答えて

1

は、bins=1に設定されて解決されます。

しかし、それはmatplotlibののhist()に内部関数によってトリガされます別のエラー、ValueError: x must be 1D or 2Dを暴く、_normalize_input()と呼ばれる:

import pandas as pd 
import seaborn as sns 
df = pd.DataFrame(['Tue','Feb',7,'15:37:58',2017,15.6196]).T 
df.columns = ['Day','Month','Date','Time','Year','floatTime'] 
sns.distplot(df.floatTime, bins=1) 

出力:

ValueError        Traceback (most recent call last) 
<ipython-input-25-858df405d200> in <module>() 
     6 df.columns = ['Day','Month','Date','Time','Year','floatTime'] 
     7 df.floatTime.values.astype(float) 
----> 8 sns.distplot(df.floatTime, bins=1) 

/home/andrew/anaconda3/lib/python3.6/site-packages/seaborn/distributions.py in distplot(a, bins, hist, kde, rug, fit, hist_kws, kde_kws, rug_kws, fit_kws, color, 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 

/home/andrew/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py in inner(ax, *args, **kwargs) 
    1890      warnings.warn(msg % (label_namer, func.__name__), 
    1891         RuntimeWarning, stacklevel=2) 
-> 1892    return func(ax, *args, **kwargs) 
    1893   pre_doc = inner.__doc__ 
    1894   if pre_doc is None: 

/home/andrew/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py in hist(self, x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs) 
    6141    x = np.array([[]]) 
    6142   else: 
-> 6143    x = _normalize_input(x, 'x') 
    6144   nx = len(x) # number of datasets 
    6145 

/home/andrew/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py in _normalize_input(inp, ename) 
    6080     else: 
    6081      raise ValueError(
-> 6082       "{ename} must be 1D or 2D".format(ename=ename)) 
    6083     if inp.shape[1] < inp.shape[0]: 
    6084      warnings.warn(

ValueError: x must be 1D or 2D 

_normalize_input()はmatplotlibのから削除された(それはlooks like sometime last year)、私はSeabornがボンネットの下で古いバージョンを参照していると思います。あなたはthis old commit_normalize_input()を見ることができます

def _normalize_input(inp, ename='input'): 
     """Normalize 1 or 2d input into list of np.ndarray or 
     a single 2D np.ndarray. 
     Parameters 
     ---------- 
     inp : iterable 
     ename : str, optional 
      Name to use in ValueError if `inp` can not be normalized 
     """ 
     if (isinstance(x, np.ndarray) or 
       not iterable(cbook.safe_first_element(inp))): 
      # TODO: support masked arrays; 
      inp = np.asarray(inp) 
      if inp.ndim == 2: 
       # 2-D input with columns as datasets; switch to rows 
       inp = inp.T 
      elif inp.ndim == 1: 
       # new view, single row 
       inp = inp.reshape(1, inp.shape[0]) 
      else: 
       raise ValueError(
        "{ename} must be 1D or 2D".format(ename=ename)) 
... 

でも、私は、なぜinp.ndim!=1を把握することはできません。期待通りの入力に同じnp.asarray().ndimを実行すると、1を返します。

np.asarray(df.floatTime).ndim # 1 

あなたはsns.distplot()と単一値の入力作業を作りたいのであれば、あなたはいくつかの障害に直面しています。

plt.hist(df.floatTime) 

single element histogram

は(distplotはKDEと一緒に、とにかくに何が起こっている)単一要素df.floatTimeの回避策
チェックを推奨し、その場合は、だけではなく、plt.hist()を使用します

関連する問題