2013-10-06 42 views
22

Matplotlibを使用して、事前カウントされたデータにヒストグラムをプロットしたいとします。例えば、私はMatplotlibの事前計算データからヒストグラムをプロットする

data = [1, 2, 2, 3, 4, 5, 5, 5, 5, 6, 10] 

は、このデータを与えられた生データを持っていると言う、私は、ヒストグラムをプロットするために

pylab.hist(data, bins=[...]) 

を使用することができます。私の場合は

、データは事前​​にカウントされた辞書のように表される:

理想的
counted_data = {1: 1, 2: 2, 3: 1, 4: 1, 5: 4, 6: 1, 10: 1} 

、私は私のコントロールをすることができますヒストグラム関数にこの前カウントデータを渡したいのですがビンの幅、プロットの範囲など、私は生のデータを渡したかのように。回避策として、私は、生データに私の数を拡大しています:counted_dataは、データポイントの数百万人のためのカウントが含まれている場合

data = list(chain.from_iterable(repeat(value, count) 
      for (value, count) in counted_data.iteritems())) 

これは非効率的です。

Matplotlibを使用して、事前カウントデータからヒストグラムを作成する方が簡単ですか?

また、事前にビン詰めされたデータを棒グラフで表示するのが最も簡単な場合は、項目ごとのカウントをビンカウントに「ロールアップ」する便利な方法がありますか?

+1

:ここでは、完全にヒストグラムを再構築するための方法だ生データにあなたの数を拡張するには、また 'Counter'クラスとその要素()メソッドを使用できます。 'コレクションからのカウンターをインポート' ' c =カウンタ(counted_data) ' ' data = list(c.elements()) ' – fireboot

答えて

14

参照:

pylab.hist(counted_data.keys(), weights=counted_data.values(), bins=range(50))

これをhistを使用してデータを再保存することができます。

+0

とデータを取得するあなたの方法は私よりも理にかなっています。あなたが自分の答えを受け入れるなら、私と一緒にいいです。 – tacaswell

+0

これは私が必要とした手がかりだった。私の場合は、カウントのリストとビンの範囲があります: 'plt.hist(ビン、ビン= len(ビン)、ウェイト=カウント)'は私が必要とした呼び出しでした –

17

はあなたが唯一のキーとして整数を持っているあなたにと仮定すると(下にいるplt.hist通話)

val, weight = zip(*[(k, v) for k,v in counted_data.items()]) 
plt.hist(val, weights=weight) 

np.histgramweightsキーワード引数を使用することができ、あなたが直接barを使用することができます。

min_bin = np.min(counted_data.keys()) 
max_bin = np.max(counted_data.keys()) 

bins = np.arange(min_bin, max_bin + 1) 
vals = np.zeros(max_bin - min_bin + 1) 

for k,v in counted_data.items(): 
    vals[k - min_bin] = v 

plt.bar(bins, vals, ...) 

どこに渡す必要がありますか?bar(doc)

あなたは再びビンにしたい場合は、あなたのデータは、私は私が欲しかったヒストグラム生成、その値によって各キーを加重するpyplot.histweightsオプションを使用Histogram with separate list denoting frequency

+0

' weights'オプションへのポインタをありがとう。私はそれを見落としていたが、それは私の問題を完全に解決する(私の答えを参照)。 –

+0

私はその接続を作っていませんでした( 'bar'を使って盲目的になりました)。あなたのコメントを反映するように編集されました。 – tacaswell

0

"bins"配列の長さは "counts"の長さより長くする必要があります。追記として

import numpy as np 
import matplotlib.pyplot as plt 
bins = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]).astype(float) 
counts = np.array([5, 3, 4, 5, 6, 1, 3, 7]).astype(float) 
centroids = (bins[1:] + bins[:-1])/2 
counts_, bins_, _ = plt.hist(centroids, bins=len(counts), 
          weights=counts, range=(min(bins), max(bins))) 
plt.show() 
assert np.allclose(bins_, bins) 
assert np.allclose(counts_, counts) 
関連する問題