PythonのMatplotlibとデータのリストを使用してヒストグラムをプロットする方法は?


97

matplotlib.hist()関数を使用してヒストグラムをプロットしようとしていますが、その方法がわかりません。

リストがあります

probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]

名前(文字列)のリスト。

各棒のy値として確率を作成し、x値として名前を付けるにはどうすればよいですか?

回答:


166

ヒストグラムが必要な場合は、x軸にデータビンがあるので、x値に「名前」を付ける必要はありません。

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
np.random.seed(42)
x = np.random.normal(size=1000)
plt.hist(x, density=True, bins=30)  # `density=False` would make counts
plt.ylabel('Probability')
plt.xlabel('Data');

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

ヒストグラムは、PDF線、タイトル、凡例を使って少し凝ったものにすることができます。

import scipy.stats as st
plt.hist(x, density=True, bins=30, label="Data")
mn, mx = plt.xlim()
plt.xlim(mn, mx)
kde_xs = np.linspace(mn, mx, 301)
kde = st.gaussian_kde(x)
plt.plot(kde_xs, kde.pdf(kde_xs), label="PDF")
plt.legend(loc="upper left")
plt.ylabel('Probability')
plt.xlabel('Data')
plt.title("Histogram");

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

ただし、OPのようにデータポイントの数が限られている場合、棒グラフはデータを表すのに意味があります(その後、x軸にラベルを付けることができます)。

x = np.arange(3)
plt.bar(x, height=[1,2,3])
plt.xticks(x, ['a','b','c'])

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


4
Pythonの行末にセミコロンがないことを忘れないでください!
Toad22222 2017年

10
@ Toad22222これは、Ipythonノートブックセルからの抜粋です。セミコロンなしで実行して、違いを確認してください。私がSOに投稿したすべてのコードスニペットは、私のコンピューターで完全に実行されます。
セルゲイブッシュマノフ2017年

2
セルゲイが使用するセミコロンについて疑問がある場合は、プロットオブジェクトに関するテキストを抑制するためにプロットするときに、Jupyterノートブック(以前のIPythonノートブック)セルでセミコロンがどのように使用されるかについて、ここ#16を参照してください。
ウェイン

19

matplotlibをまだインストールしていない場合は、コマンドを試してください。

> pip install matplotlib

ライブラリのインポート

import matplotlib.pyplot as plot

ヒストグラムデータ:

plot.hist(weightList,density=1, bins=20) 
plot.axis([50, 110, 0, 0.06]) 
#axis([xmin,xmax,ymin,ymax])
plot.xlabel('Weight')
plot.ylabel('Probability')

ヒストグラムを表示

plot.show()

そして出力は次のようになります:

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


2
この例では、plot.axis([50、110、0、0.06]) 'の線は役に立ちません。さらに、表示するプロットの領域をハードコーディングしているため、データが完全にその中に収まらない場合、データが正しく表示されない理由を混乱させる可能性があります。
typhon04

8

質問はmatplotlib.hist()関数を使用してヒストグラムをプロットすることを要求しているように見えますが、質問の後半と同じように使用して間違いなく実行できない場合があります。 x値。

プロットを描くために、与えられた確率に対応する名前のサンプルリストを想定しています。単純な棒グラフは、ここで与えられた問題の目的を果たします。次のコードを使用できます。

import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]
names = ['name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7', 'name8', 'name9',
'name10', 'name11', 'name12', 'name13'] #sample names
plt.bar(names, probability)
plt.xticks(names)
plt.yticks(probability) #This may be included or excluded as per need
plt.xlabel('Names')
plt.ylabel('Probability')

4

これは非常に大まかな方法​​ですが、ビンの値はわかっているがソースデータがないヒストグラムを作成する場合は、np.random.randint関数を使用して、それぞれの範囲内で正しい数の値を生成できます。hist関数がグラフ化するためのビン。次に例を示します。

import numpy as np
import matplotlib.pyplot as plt

data = [np.random.randint(0, 9, *desired y value*), np.random.randint(10, 19, *desired y value*), etc..]
plt.hist(data, histtype='stepfilled', bins=[0, 10, etc..])

ラベルについては、xティックをビンに揃えて次のようなものを取得できます。

#The following will align labels to the center of each bar with bin intervals of 10
plt.xticks([5, 15, etc.. ], ['Label 1', 'Label 2', etc.. ])

2

これは古い質問ですが、以前の回答のいずれも、実際の問題、つまり問題が質問自体にあるという事実に対処していません。

最初に、確率が既に計算されている場合、つまりヒストグラムの集計データが正規化された方法で利用できる場合、確率は1まで増えるはずです。明らかにそうではありません。これは、用語またはデータのいずれかで問題が発生していることを意味しますまたは質問の仕方で。

第2に、ラベルが(間隔ではなく)提供されているという事実は、通常、確率がカテゴリカル応答変数であることを意味します-ヒストグラムをプロットするためのバープロットの使用が最適です(またはpyplotのhistメソッドのハッキングが最適です)。 Shayan Shafiqの答えはコードを提供します。

ただし、問題1を参照してください。これらの確率は正しくありません。この場合、「ヒストグラム」は単変量分布のストーリーを伝えないため、何らかの理由で(クラスが重複しており、観測値が複数カウントされている可能性があるため)棒グラフを使用すると間違っています。この場合、そのようなプロットはヒストグラムと呼ばれるべきではありません。

ヒストグラムは、定義上、単変量変数の分布のグラフィカル表現です(https://www.itl.nist.gov/div898/handbook/eda/section3/histogra.htm、https://en.wikipedia.org/wiki参照) /ヒストグラム)そして、関心のある変数の選択されたクラスにおける観測のカウントまたは頻度を表すサイズのバーを描画することによって作成されます。変数が連続スケールで測定される場合、これらのクラスはビン(間隔)です。ヒストグラム作成手順の重要な部分は、カテゴリ変数の応答のカテゴリをグループ化する(またはグループ化せずに維持する)方法、または可能な値のドメインを間隔に分割する方法(ビンの境界を配置する場所)を連続的に選択することです。タイプ変数。すべての観測は表現されるべきであり、各観測はプロットで一度だけです。つまり、バーのサイズの合計は観測値の合計数(または可変幅の場合はそれらの面積、これはあまり一般的ではないアプローチ)と等しくなければなりません。または、ヒストグラムが正規化されている場合、すべての確率の合計が1になる必要があります。

データ自体が応答としての「確率」のリストである場合、つまり観測値が研究の各オブジェクトの(何かの)確率値である場合、最良の答えは単にplt.hist(probability)ビニングオプションであり、すでに利用可能なxラベルの使用は疑わしい。

次に、棒グラフをヒストグラムとして使用するのではなく、単に

import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]
plt.hist(probability)
plt.show()

結果とともに

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

そのような場合のmatplotlibは、デフォルトで次のヒストグラム値とともに到着します

(array([1., 1., 1., 1., 1., 2., 0., 2., 0., 4.]),
 array([0.31308411, 0.32380469, 0.33452526, 0.34524584, 0.35596641,
        0.36668698, 0.37740756, 0.38812813, 0.39884871, 0.40956928,
        0.42028986]),
 <a list of 10 Patch objects>)

結果は配列のタプルです。最初の配列には観測カウントが含まれます。つまり、プロットのy軸に対して表示されるもの(合計で13、観測の総数)で、2番目の配列はxの区間境界です-軸。

それらが等間隔に配置されていることを確認できます。

x = plt.hist(probability)[1]
for left, right in zip(x[:-1], x[1:]):
  print(left, right, right-left)

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

または、たとえば3つのビン(13の観測に対する私の判断の呼び出し)の場合、このヒストグラムを取得します。

plt.hist(probability, bins=3)

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

「棒の後ろ」のプロットデータは

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

質問の著者は、値の「確率」リストの意味が何であるかを明確にする必要があります-「確率」は、応答変数の名前です(そして、ヒストグラムにxラベルが用意されているのはなぜですか、意味がありません) )、またはデータから計算された確率のリスト値です(合計が1にならないという事実は意味がありません)。

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