ヒストグラムMatplotlib


107

だから私は少し問題があります。scipyに既にヒストグラム形式のデータセットがあるので、ビンの中心とビンあたりのイベント数を取得しました。どうすればヒストグラムとしてプロットできますか?ただやってみた

bins, n=hist()

しかし、それはそれが好きではありませんでした。何かお勧めですか?

回答:


239
import matplotlib.pyplot as plt
import numpy as np

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
hist, bins = np.histogram(x, bins=50)
width = 0.7 * (bins[1] - bins[0])
center = (bins[:-1] + bins[1:]) / 2
plt.bar(center, hist, align='center', width=width)
plt.show()

ここに画像の説明を入力してください

オブジェクト指向のインターフェースも簡単です。

fig, ax = plt.subplots()
ax.bar(center, hist, align='center', width=width)
fig.savefig("1.png")

カスタム(非定数)ビンを使用している場合は、を使用して幅を計算し、幅をnp.diffに渡して、ビンのエッジにラベルを付けるためにax.bar使用できax.set_xticksます。

import matplotlib.pyplot as plt
import numpy as np

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
bins = [0, 40, 60, 75, 90, 110, 125, 140, 160, 200]
hist, bins = np.histogram(x, bins=bins)
width = np.diff(bins)
center = (bins[:-1] + bins[1:]) / 2

fig, ax = plt.subplots(figsize=(8,3))
ax.bar(center, hist, align='center', width=width)
ax.set_xticks(bins)
fig.savefig("/tmp/out.png")

plt.show()

ここに画像の説明を入力してください


ビンのエッジを棒グラフのx軸に渡す方法はありますか?
CMCDragonkai 2016

@CMCDragonkai:plt.barwidthパラメーターは、(スカラーの代わりに)配列のようなオブジェクトを受け入れることができます。したがって、のwidth = np.diff(bins)代わりに使用できますwidth = 0.7 * (bins[1] - bins[0])
unutbu 2016

しかし、width設定自体はバーの幅を正しく設定するだけですか?私はx軸のラベルについて話している(つまり、実際のビンの端がx軸のラベルであることを確認したい)。それはどのようにplt.hist機能するかに似ているはずです。
CMCDragonkai

2
@CMCDragonkai:xlabelsのax.set_xticks設定に使用できます。上記の例を追加して、意味を示します。
unutbu 2016

22

バーが必要ない場合は、次のようにプロットできます。

import numpy as np
import matplotlib.pyplot as plt

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)

bins, edges = np.histogram(x, 50, normed=1)
left,right = edges[:-1],edges[1:]
X = np.array([left,right]).T.flatten()
Y = np.array([bins,bins]).T.flatten()

plt.plot(X,Y)
plt.show()

ヒストグラム


6
も使用できますax.step
tacaswell 2014年

12

これであなたの質問に答えられないことはわかっていますが、ヒストグラムのmatplotlibソリューションを検索すると、単純histogram_demoにmatplotlibサンプルギャラリーページから削除されたため、常にこのページに行き着きます。

以下は、numpyインポートする必要のないソリューションです。numpyのみをインポートxして、プロットするデータを生成します。@unutbuによる回答のように、hist関数ではなく関数に依存します。bar

import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)

import matplotlib.pyplot as plt
plt.hist(x, bins=50)
plt.savefig('hist.png')

ここに画像の説明を入力してください

また、matplotlibギャラリーmatplotlibの例も確認してください。


「これがnumpyを必要としないソリューションです」-コードの最初の行はnumpyをインポートします:)
Martin R.

2
@Martin R.これは、プロットするデータを生成するためだけのものです。4-6行目を参照してください。numpyは使用しません。
tommy.carstensen

6

使用したい場合pandas

pandas.DataFrame({'x':hist[1][1:],'y':hist[0]}).plot(x='x',kind='bar')

27
使用を提案するpandas場合は、おそらく彼らのサイトへのリンクと、何が起こっているのかを説明する詳細な例を含める必要があります。
tacaswell 2014年

0

これは誰かに役立つかもしれないと思います。

Numpyのヒストグラム関数は、私に不快感を与えます(ただし、その正当な理由はあると思いますが)、ビンの値ではなく、各ビンのエッジを返します。これは、間隔内にある可能性のある浮動小数点数(つまり、中心値はあまり意味がない)には意味がありますが、離散値または整数(0、1、2など)を処理する場合、望ましい出力ではありません。 。特に、np.histogramから返されるビンの長さは、カウントの長さ/密度と等しくありません。

これを回避するために、np.digitizeを使用して入力を量子化し、各ビンのカウントの割合とともに、ビンの離散数を返しました。簡単に編集して、整数のカウントを取得できます。

def compute_PMF(data)
    import numpy as np
    from collections import Counter
    _, bins = np.histogram(data, bins='auto', range=(data.min(), data.max()), density=False)
    h = Counter(np.digitize(data,bins) - 1)
    weights = np.asarray(list(h.values())) 
    weights = weights / weights.sum()
    values = np.asarray(list(h.keys()))
    return weights, values
####

参照:

[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html

[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.