Плотные оси подграфиков без их сюжета к фигуре

Я создал подзаголовок в matplotlib и сумел поместить разные cmap в один и тот же столбец. Минимальный рабочий пример (с фиктивными cmaps):

import matplotlib.pyplot as plt
import numpy as np

# Generate sample data
data1 = np.random.rand(10, 10)
data2 = np.random.rand(10, 10)
data3 = np.random.rand(10, 10)

fig_bandwidth = plt.figure(figsize=(12, 6))
ax1 = plt.subplot(3, 2, 6)
ax2 = plt.subplot(3, 2, 4)
ax3 = plt.subplot(3, 2, 2)
ax_bandwidth = plt.subplot(1, 3, 1)
axes = [ax1, ax2, ax3]

# Plot data and add color bars
for ax, data in zip(axes, [data1, data2, data3]):
    cax = ax_bandwidth.imshow(data, aspect='auto', cmap='viridis')
    plt.colorbar(cax, ax=ax)
    ax.axis('off')
plt.tight_layout()
plt.show()

Я пытаюсь создать плотный подсюжет с фигурой слева и тремя цветными полосами справа в одном столбце, но кажется, что поля для построения все еще там, что не позволяет мне разместить эти оси рядом с фигурой. . Может быть, использование подзаголовков — не лучшее решение, есть какие-нибудь предложения?

Тогда как я мог разместить заголовок топора, охватывающий три цветные полосы, поскольку они представляют одно и то же (пропускная способность в МГц для контекста).

У вас есть полный код, связанный с каким-нибудь репо? Кто-то другой, возможно, сможет решить эту проблему с помощью минимальной выборки, но наличие cmaps и всего остального поможет воспроизвести проблему.

M.A. 06.06.2024 11:46

@М.А. Да, но это было бы слишком утомительно, я обновил минимальный рабочий пример, включив в него несколько фиктивных цветных полос.

Chris Ze Third 06.06.2024 11:52
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Использование add_axes работает намного лучше, чем sublots. Это дает мне гораздо больше свободы в размещении.

Вот минимальный рабочий пример с фиктивными cbar:

fig_bandwidth = plt.figure(figsize=(12, 6))
# Creating three axes: add_axes([xmin,ymin,dx,dy])
ax1 = fig_bandwidth.add_axes((0.75, 0.05, 0.1, 0.3))
ax2 = fig_bandwidth.add_axes((0.75, 0.36, 0.1, 0.3))
ax3 = fig_bandwidth.add_axes((0.75, 0.67, 0.1, 0.3))
ax_bandwidth = fig_bandwidth.add_axes((0.1, 0.05, 0.7, 0.92))
axes = [ax1, ax2, ax3]
# Generate sample data
data1 = np.random.rand(10, 10)
data2 = np.random.rand(10, 10)
data3 = np.random.rand(10, 10)
for ax, data in zip(axes, [data1, data2, data3]):
    cax = ax_bandwidth.imshow(data, aspect='auto', cmap='viridis')
    plt.colorbar(cax, ax=ax)
    ax.axis('off')
plt.show()

Другой вариант — настроить подграфики с помощью subplot_mosaic. Обратите внимание, что я передаю оси в colorbar через параметр cax вместо ax, поэтому он используется напрямую, а не создает новые оси путем «кражи» пространства у ax. Я также вручную установил соотношение сторон на 20, поскольку 20 — это значение по умолчанию, когда colorbar создает новые оси.

supylabel можно использовать для добавления метки для трех правых осей.

import matplotlib.pyplot as plt
import numpy as np

# Generate sample data
data1 = np.random.rand(10, 10)
data2 = np.random.rand(10, 10)
data3 = np.random.rand(10, 10)

mosaic = """
AB
AC
AD
"""

fig_bandwidth, ax_dict = plt.subplot_mosaic(mosaic, figsize=(12, 6), width_ratios=(8, 1))
ax_bandwidth = ax_dict['A']

# Plot data and add color bars
for key, data in zip('BCD', [data1, data2, data3]):
    im = ax_bandwidth.imshow(data, aspect='auto', cmap='viridis')
    cbar_ax = ax_dict[key]
    cbar_ax.set_aspect(20)
    plt.colorbar(im, cax=cbar_ax)
    
fig_bandwidth.supylabel('Bandwidth', x=0.98)
    
plt.tight_layout()
plt.show()

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