web-dev-qa-db-ja.com

ヒストグラムプロットでラベルを中央に配置する方法

私は次のようなnumpy配列resultsを持っています

[ 0.  2.  0.  0.  0.  0.  3.  0.  0.  0.  0.  0.  0.  0.  0.  2.  0.  0.
  0.  0.  0.  1.  0.  0.  0.  0.  0.  0.  0.  1.  0.  0.  0.  0.  0.  0.
  0.  1.  1.  0.  0.  0.  0.  2.  0.  3.  1.  0.  0.  2.  2.  0.  0.  0.
  0.  0.  0.  0.  0.  1.  1.  0.  0.  0.  0.  0.  0.  2.  0.  0.  0.  0.
  0.  1.  0.  0.  0.  0.  0.  0.  0.  0.  0.  3.  1.  0.  0.  0.  0.  0.
  0.  0.  0.  1.  0.  0.  0.  1.  2.  2.]

そのヒストグラムをプロットしたいと思います。私が試してみました

import matplotlib.pyplot as plt
plt.hist(results, bins=range(5))
plt.show()

これにより、x軸に0.0 0.5 1.0 1.5 2.0 2.5 3.0. 3.5 4.0というラベルの付いたヒストグラムが表示されます。

各バーの中央にラベルを付ける代わりに、x軸に0 1 23のラベルを付けたいと思います。どうやってそれができる?

13
eleanora

次の代替ソリューションはplt.hist()と互換性があります(これには、たとえばpandas.DataFrame.hist()の後に呼び出すことができるという利点があります。

import numpy as np

def bins_labels(bins, **kwargs):
    bin_w = (max(bins) - min(bins)) / (len(bins) - 1)
    plt.xticks(np.arange(min(bins)+bin_w/2, max(bins), bin_w), bins, **kwargs)
    plt.xlim(bins[0], bins[-1])

(最後の行はOPから厳密に要求されているわけではありませんが、出力が向上します)

これは次のように使用できます。

import matplotlib.pyplot as plt
bins = range(5)
plt.hist(results, bins=bins)
bins_labels(bins, fontsize=20)
plt.show()

Result: success!

7

他の答えは私のためにそれをしません。 plt.barよりもplt.histを使用する利点は、バーがalign='center'を使用できることです。

import numpy as np
import matplotlib.pyplot as plt

arr = np.array([ 0.,  2.,  0.,  0.,  0.,  0.,  3.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  2.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  1.,
        0.,  0.,  0.,  0.,  2.,  0.,  3.,  1.,  0.,  0.,  2.,  2.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  1.,  0.,  0.,  0.,  0.,
        0.,  0.,  2.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  3.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  1.,  0.,  0.,  0.,  1.,  2.,  2.])

labels, counts = np.unique(arr, return_counts=True)
plt.bar(labels, counts, align='center')
plt.gca().set_xticks(labels)
plt.show()

centering labels in a histogram

10
Jarad

np.histogramからbarプロットを作成できます。

このことを考慮

his = np.histogram(a,bins=range(5))
fig, ax = plt.subplots()
offset = .4
plt.bar(his[1][1:],his[0])
ax.set_xticks(his[1][1:] + offset)
ax.set_xticklabels( ('1', '2', '3', '4') )

enter image description here

EDIT:バーを互いに接触させるには、widthパラメーターを操作する必要があります。

 fig, ax = plt.subplots()
 offset = .5
 plt.bar(his[1][1:],his[0],width=1)
 ax.set_xticks(his[1][1:] + offset)
 ax.set_xticklabels( ('1', '2', '3', '4') )

enter image description here

5
Acorbe

これは、plt.hist()のみを使用するソリューションです。これを2つの部分に分けてみましょう。

  1. X軸に_0 1 2 3_というラベルを付けます。
  2. 各バーの中央にラベルを配置します。

_0 1 2 3_値なしでx軸に_.5_というラベルを付けるには、関数plt.xticks()を使用して、x軸に必要な値を引数として指定できます。あなたの場合、_0 1 2 3_が必要なので、plt.xticks(range(4))を呼び出すことができます。

各バーの中央にラベルを配置するには、引数_align='left'_をplt.hist()関数に渡すことができます。以下は、それを行うために最小限に変更されたコードです。

_import numpy as np
import matplotlib.pyplot as plt

results = [0,  2,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,
           0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
           0,  1,  1,  0,  0,  0,  0,  2,  0,  3,  1,  0,  0,  2,  2,  0,  0,  0,
           0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,
           0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  1,  0,  0,  0,  0,  0,
           0,  0,  0,  1,  0,  0,  0,  1,  2,  2]

plt.hist(results, bins=range(5), align='left')
plt.xticks(range(4))
plt.show()
_

enter image description here

0
ricpacca