Я создал подзаголовок в 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()
Я пытаюсь создать плотный подсюжет с фигурой слева и тремя цветными полосами справа в одном столбце, но кажется, что поля для построения все еще там, что не позволяет мне разместить эти оси рядом с фигурой. . Может быть, использование подзаголовков — не лучшее решение, есть какие-нибудь предложения?
Тогда как я мог разместить заголовок топора, охватывающий три цветные полосы, поскольку они представляют одно и то же (пропускная способность в МГц для контекста).
@М.А. Да, но это было бы слишком утомительно, я обновил минимальный рабочий пример, включив в него несколько фиктивных цветных полос.






Использование 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()
У вас есть полный код, связанный с каким-нибудь репо? Кто-то другой, возможно, сможет решить эту проблему с помощью минимальной выборки, но наличие cmaps и всего остального поможет воспроизвести проблему.