Параллельное построение сложных гистограмм

#python #python-3.x #matplotlib #plot #histogram

#python #python-3.x #matplotlib #построение #гистограмма

Вопрос:

Я пытаюсь построить три гистограммы бок о бок (одна строка, 3 столбца), используя цикл for и повторяя один и тот же код, но для другого столбца. Я нашел два разных метода: один — использовать plt.subplots(1, 3, i), а затем выполнить итерацию по i, а другой — явно установить fig, ax = plt.subplots() и заменить каждый plt на ax[i] и повторить это.

Однако ни одна из них не работает должным образом из-за дополнительных строк, которые я отображаю на гистограммах.

Как я мог бы заставить этот код работать для параллельных графиков?

 for parameter in ['k', 'm', 'sig']:

        plt.hist(df[parameter], density=True, bins=20, label=parameter, ec='black')
        mn, mx = plt.xlim()
        plt.xlim(mn, mx)
        kde_xs = np.linspace(mn, mx, 301)
        kde = st.gaussian_kde(df[parameter])
        plt.plot(kde_xs, kde.pdf(kde_xs), label="PDF")
        plt.legend(loc="upper left")
        plt.ylabel('Frequency')
        plt.xlabel([parameter])
        plt.title(f"Histogram for bootstrapped: {parameter}")
        plt.axvline(df[parameter].mean(), color='r', linestyle='solid', 
        linewidth=2)
 

Комментарии:

1. Тогда ваша проблема реализуется Axes.axvline ?

2. Несколько проблем, одна из которых — plt.xlim, если я реализую ax [i].xlim, тогда это не сработает. Другой проблемой является plt.title, который не будет работать с ax[i].title . Axvline, похоже, работает нормально. Я думаю, я бы искал общий метод, который позволяет избежать полного изменения кода. Я чувствую, что мне не хватает какого-то простого трюка.

3. ax.set_xlim и ax.set_title ?

4. См. Также Жизненный цикл графика о двух разных API.

5. Отлично, не стесняйтесь публиковать пересмотренный код в качестве ответа!

Ответ №1:

Мне просто нужно было сделать следующее. Используйте оси [i] для всего и функцию zip для итерации по гистограммам.

     fig, axes = plt.subplots(1, 3, figsize=(26, 7))
    for parameter, i in zip(['k', 'm', 'sig'], [0, 1, 2]):

        axes[i].hist(data[parameter].dropna(), density=True, bins=20, label=parameter, ec='black')
        mn, mx = axes[i].set_xlim()
        axes[i].set_xlim(mn, mx)
        kde_xs = np.linspace(mn, mx, 301)
        kde = st.gaussian_kde(data[parameter].dropna())
        axes[i].plot(kde_xs, kde.pdf(kde_xs), label="PDF")
        axes[i].legend(loc="upper left")
        axes[i].set_ylabel('Frequency')
        axes[i].set_xlabel([parameter])
        axes[i].set_title(f"Histogram for bootstrapped: {parameter}")
        axes[i].axvline(data[parameter].dropna().mean(), color='r', linestyle='solid', linewidth=2)