私は次のような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のラベルを付けたいと思います。どうやってそれができる?
次の代替ソリューションは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()
他の答えは私のためにそれをしません。 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()
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') )
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') )
これは、plt.hist()
のみを使用するソリューションです。これを2つの部分に分けてみましょう。
0 1 2 3
_というラベルを付けます。_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()
_