ノート
完全なサンプルコードをダウンロードするには、ここをクリックしてください
複数のヒストグラムを並べて作成する#
この例では、さまざまなサンプルの水平ヒストグラムをカテゴリカル x 軸に沿ってプロットします。さらに、ヒストグラムは x 位置に関して対称になるようにプロットされるため、バイオリン プロットと非常によく似ています。
この高度に専門化されたプロットを作成するには、標準的なhist
方法は使用できません。代わりにbarh
、水平バーを直接描画するために使用します。バーの垂直位置と長さは、
np.histogram
関数を介して計算されます。すべてのサンプルのヒストグラムは、同じ範囲 (最小値と最大値) とビンの数を使用して計算されるため、各サンプルのビンは同じ垂直位置にあります。
異なるビン数とサイズを選択すると、ヒストグラムの形状に大きな影響を与える可能性があります。Astropy のドキュメントには、これらのパラメーターを選択する方法に関する優れたセクションがあります: http://docs.astropy.org/en/stable/visualization/histogram.html
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(19680801)
number_of_bins = 20
# An example of three data sets to compare
number_of_data_points = 387
labels = ["A", "B", "C"]
data_sets = [np.random.normal(0, 1, number_of_data_points),
np.random.normal(6, 1, number_of_data_points),
np.random.normal(-3, 1, number_of_data_points)]
# Computed quantities to aid plotting
hist_range = (np.min(data_sets), np.max(data_sets))
binned_data_sets = [
np.histogram(d, range=hist_range, bins=number_of_bins)[0]
for d in data_sets
]
binned_maximums = np.max(binned_data_sets, axis=1)
x_locations = np.arange(0, sum(binned_maximums), np.max(binned_maximums))
# The bin_edges are the same for all of the histograms
bin_edges = np.linspace(hist_range[0], hist_range[1], number_of_bins + 1)
heights = np.diff(bin_edges)
centers = bin_edges[:-1] + heights / 2
# Cycle through and plot each histogram
fig, ax = plt.subplots()
for x_loc, binned_data in zip(x_locations, binned_data_sets):
lefts = x_loc - 0.5 * binned_data
ax.barh(centers, binned_data, height=heights, left=lefts)
ax.set_xticks(x_locations, labels)
ax.set_ylabel("Data values")
ax.set_xlabel("Data sets")
plt.show()