У меня есть фигура с тремя сюжетами. Два верхних субплота имеют одинаковый диапазон данных, а нижние показывают данные с другим диапазоном данных. Я хотел бы использовать только одну цветовую шкалу для всей фигуры, имея галочки для двух верхних вспомогательных участков слева от цветовой шкалы и отметки для нижнего вспомогательного графика справа от цветной панели (см. Рис. Ниже).
Я смог сделать это, используя грязный хак, а именно, отображая две цветовые полосы друг над другом и перемещая отметки одного из них влево. В качестве примера я изменил этот пример matplotlib :
import matplotlib.pyplot as plt
import numpy as np
# Fixing random state for reproducibility
np.random.seed(19680801)
# create three subplots
fig, axes = plt.subplots(3)
# filling subplots with figures and safing the map of the first and third figure.
# fig 1-2 have a data range of 0 - 1
map12 =axes[0].imshow(np.random.random((100, 100)), cmap=plt.cm.BuPu_r)
axes[1].imshow(np.random.random((100, 100)), cmap=plt.cm.BuPu_r)
# figure 3 has a larger data range from 0 - 5
map3 = axes[2].imshow(np.random.random((100, 100))*5, cmap=plt.cm.BuPu_r)
# Create two axes for the colorbar on the same place.
# They have to be very slightly missplaced, else a warning will appear and only the second colorbar will show.
cax12 = plt.axes([0.85, 0.1, 0.075, 0.8])
cax3 = plt.axes([0.85, 0.100000000000001, 0.075, 0.8])
# plot the two colorbars
cbar12 = plt.colorbar(map12, cax=cax12, label='ticks for top two figs')
cbar3 = plt.colorbar(map3, cax=cax3, label='ticks for bottom fig')
# move ticks and label of second plot to the left
cbar12.ax.yaxis.set_ticks_position('left')
cbar12.ax.yaxis.set_label_position('left')
## display image
plt.show()
Хотя я доволен визуальным результатом, я думаю, что должен быть лучший способ сделать это. Одна проблема заключается в том, что если вы сохраните его как векторную графику, вы получите перекрывающиеся фигуры. Также, если вы ошибетесь с цветами нижней цветовой шкалы, вы можете не осознавать этого, потому что цвета скрыты, или это может вызвать головную боль, если вы по какой-то причине захотите сделать цветную полосу прозрачной. Поэтому мне интересно, как можно это сделать правильно, или если это невозможно, если есть лучший взлом?
