Правильное добавление второго набора тиков в палитру python matplotlib - PullRequest
0 голосов
/ 17 января 2019

У меня есть фигура с тремя сюжетами. Два верхних субплота имеют одинаковый диапазон данных, а нижние показывают данные с другим диапазоном данных. Я хотел бы использовать только одну цветовую шкалу для всей фигуры, имея галочки для двух верхних вспомогательных участков слева от цветовой шкалы и отметки для нижнего вспомогательного графика справа от цветной панели (см. Рис. Ниже).

Я смог сделать это, используя грязный хак, а именно, отображая две цветовые полосы друг над другом и перемещая отметки одного из них влево. В качестве примера я изменил этот пример 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()

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

Output of code

1 Ответ

0 голосов
/ 17 января 2019

Вы можете достичь того же результата, не рисуя вторую цветовую панель, вам просто нужно создать новые оси с галочками вправо и отрегулировать диапазон оси Y в соответствии с диапазоном данных вашего третьего графика.

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. 
cax12 = plt.axes([0.85, 0.1, 0.075, 0.8])
cax3 = cax12.twinx()
# plot first colorbar
cbar12 = plt.colorbar(map12, cax=cax12, label='ticks for top two figs')
# move ticks and label of colorbar to the left
cbar12.ax.yaxis.set_ticks_position('left')
cbar12.ax.yaxis.set_label_position('left')
# adjust limits of right axis to match data range of 3rd plot
cax3.set_ylim(0,5)
cax3.set_ylabel('ticks for bottom fig')
## display image
plt.show()

enter image description here

...