Seaborn / Matplotlib: изменение осевых пределов двумерной гистограммы без искажения размера бина

Я пытаюсь построить две двумерные гистограммы с одинаковыми пределами оси. Когда я просто рисую оба из них, не пытаясь изменить ни одну из их осей, я получаю это (исключая некоторые стандартные определения параметров данных и форматирование галочки x/y):

def create_hist_plot(params, ax, cbar_ax=None, color=GK_GREEN, bins=80):
    result = sns.histplot(
        **params,
        ax=ax,
        kde=True,
        bins=bins,
        color=color,
    )
    return result

ax_2 = create_hist_plot(params_1, ax_2, color=GREEN, bins=40)
ax_3 = create_hist_plot(params_2, ax_3, color=PURPLE, bins=40)

Я хочу изменить размер фиолетовой гистограммы, чтобы она имела те же пределы оси, что и зеленая гистограмма. Я пытался вручную установить такие ограничения (ax_3 — фиолетовая гистограмма, ax_2 — зеленая гистограмма)

ax_3.set_ylim(ax_2.get_ylim())
ax_3.set_xlim(ax_2.get_xlim())

что дает мне

но обратите внимание, как бины на фиолетовой гистограмме теперь искажены. Есть ли способ изменить пределы осей гистограммы, не искажая ячейки?

Не могли бы вы добавить код для создания двумерных гистограмм? Вероятно, вы можете добавить параметр bins=, чтобы использовать одни и те же интервалы в обеих гистограммах.

JohanC 13.12.2020 02:16

Я добавил соответствующий код. Я указываю размер ячейки 40 для обоих участков.

Ben 13.12.2020 03:44

Вы должны добавить не простое число для bins=, а пару векторов, один для x и один для y. Поскольку неясно, как создаются данные и оси, трудно показать пример. Вектор может быть чем-то вроде np.linspace(min_val, max_val, 40), используя одни и те же минимум и максимум для обеих гистограмм.

JohanC 13.12.2020 10:40

Это отличный совет! Я немного повозился с тем, что вы сказали, и я получил результаты, которые хотел. Я обновлю свой вопрос, чтобы включить код, который у меня сработал. Если вы хотите поместить свой комментарий в качестве ответа, я отмечу его как принятый. Спасибо!

Ben 13.12.2020 13:27

Бен, пожалуйста, добавьте это как ответ и примите его. Не включайте ответ в вопрос.

Mr. T 13.12.2020 15:23

Редактирование вашего вопроса для включения ответа считается неуместным. Если у вас есть время, пожалуйста, ① отмените свой вопрос, ② поместите свой ответ там, где он должен быть (т. е. в ответе) и ③, возможно, примите его, чтобы будущие читатели знали, что он сработал для вас.

gboffi 13.12.2020 15:27

Я добавил решение в качестве ответа. Я отмечу это как принятый ответ завтра. Спасибо

Ben 13.12.2020 16:01
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
238
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на рекомендации johanc в комментариях, я попробовал следующее и получил желаемый результат.

def create_hist_plot(params, ax, cbar_ax=None, color=GK_GREEN, bins=80):
    result = sns.histplot(
        **params,
        ax=ax,
        kde=True,
        bins=bins,
        color=color,
    )
    return result

ax_2 = create_hist_plot(params_1, ax_2, color=GREEN, bins=40)
bins = [
    np.linspace(ax_2.get_xlim()[0], ax_2.get_xlim()[1], 40),
    np.linspace(ax_2.get_ylim()[0], ax_2.get_ylim()[1], 40)
]
ax_3 = create_hist_plot(params_2, ax_3, color=PURPLE, bins=bins)

Результат

Другие вопросы по теме