Вы можете выбрать отфильтрованную часть фрейма данных, просто проиндексировав: df[df['Level'] == level]['Total']
. Вы можете l oop через оси, используя for ax in axes.flatten()
. Чтобы также получить индекс, используйте for ind, ax in enumerate(axes.flatten())
. Обратите внимание, что Python обычно начинает отсчет с 1, поэтому добавление 1 к индексу было бы хорошим выбором для указания уровня.
Обратите внимание, что когда у вас есть обратная косая черта в строке, вы можете избежать их, используя r -string: r'home\NewFiles\Files.csv'
.
Значение ylim по умолчанию составляет от 0 до максимальной высоты полосы плюс некоторые отступы. Это можно изменить для каждого ax
отдельно. В приведенном ниже примере для демонстрации принципа используется список значений ymax.
ax.grid(True, axis='both)
устанавливает сетку для этого ax
. Вместо «обоих» можно также использовать «x» или «y», чтобы задать сетку только для этой оси. Линия сетки рисуется для каждого значения тика. (В приведенном ниже примере делается попытка использовать мало места, поэтому видно только несколько линий сетки.)
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
N = 1000
df = pd.DataFrame({'Level': np.random.randint(1, 6, N), 'Total': np.random.uniform(1, 5, N)})
fig, axes = plt.subplots(nrows=5, ncols=1, sharex=True)
ymax_per_level = [27, 29, 28, 26, 27]
for ind, (ax, lev_ymax) in enumerate(zip(axes.flatten(), ymax_per_level)):
level = ind + 1
n_bins = 13
ax.hist(df[df['Level'] == level]['Total'], bins=n_bins, histtype='bar')
ax.set_ylabel(f'TL={level}') # to add the level in the ylabel
ax.set_ylim(0, lev_ymax)
ax.grid(True, axis='both')
plt.show()
PS: A stacked histogram with custom legend could be created as:
import matplotlib.pyplot as plt
from matplotlib.patches import Patch
import pandas as pd
import numpy as np
N = 1000
df = pd.DataFrame({'Level': np.random.randint(1, 6, N),
'RFResult': np.random.uniform(1, 5, N),
'PRIResult': np.random.uniform(1, 5, N),
'PDResult': np.random.uniform(1, 5, N)})
df['Total'] = df['RFResult'] + df['PRIResult'] + df['PDResult']
fig, axes = plt.subplots(nrows=5, ncols=1, sharex=True)
colors = ['crimson', 'limegreen', 'dodgerblue']
column_names = ['RFResult', 'PRIResult', 'PDResult']
for level, ax in enumerate(axes.flatten(), start=1):
n_bins = 13
level_data = df[df['Level'] == level][column_names].to_numpy()
level_mean = level_data.mean()
ax.hist(level_data, bins=n_bins,
histtype='bar', stacked=True, color=colors)
ax.axvline(level_mean, color='gold', ls=':', lw=2)
ax.set_ylabel(f'TL={level}') # to add the level in the ylabel
ax.margins(x=0.01)
ax.grid(True, axis='both')
legend_handles = [Patch(color=color) for color in colors]
axes[0].legend(legend_handles, column_names, ncol=len(column_names), loc='lower center', bbox_to_anchor=(0.5, 1.02))
plt.show()
гистограмма с накоплением