Подзаголовки Imshow с той же цветовой полосой

Я хочу создать 4 imshow подсюжета, но все они имеют одну и ту же цветовую карту. Matplotlib автоматически регулирует масштаб цветовой карты в зависимости от записей матриц. Например, если в одной из моих матриц все элементы равны 10, а в другой все элементы равны 5, и я использую цветовую карту Greys, тогда один из моих подзаголовков должен быть полностью черным, а другой - полностью серым. Но оба они в конечном итоге становятся полностью черными. Как сделать так, чтобы все подзаголовки имели одинаковый масштаб на цветовой карте?


person lovespeed    schedule 01.08.2013    source источник
comment
Кажется, у этого поста есть ответ, который может вам помочь. stackoverflow.com/questions/3373256/   -  person bserra    schedule 01.08.2013
comment
возможный дубликат Matplotlib 2 Subplots, 1 Colorbar   -  person Ruggero Turra    schedule 03.03.2015


Ответы (3)


Чтобы сделать это правильно, вам нужно, чтобы все изображения имели одинаковую шкалу яркости, иначе colorbar() цвета не имеют смысла. Для этого используйте аргументы vmin и vmax imshow() и убедитесь, что они одинаковы для всех ваших изображений.

Например, если диапазон значений, которые вы хотите показать, составляет от 0 до 10, вы можете использовать следующее:

import pylab as plt
import numpy as np
my_image1 = np.linspace(0, 10, 10000).reshape(100,100)
my_image2 = np.sqrt(my_image1.T) + 3
subplot(1, 2, 1)
plt.imshow(my_image1, vmin=0, vmax=10, cmap='jet', aspect='auto')
plt.subplot(1, 2, 2)
plt.imshow(my_image2, vmin=0, vmax=10, cmap='jet', aspect='auto')
plt.colorbar()

введите описание изображения здесь

person tiago    schedule 01.08.2013
comment
не очень красиво, поскольку вторая ось уже, см. stackoverflow.com / questions / 13784201 / вместо этого - person Ruggero Turra; 03.03.2015
comment
@RuggeroTurra Верно, но это потому, что aspect='auto' и в любом случае может быть скорректировано путем изменения пространств подзаголовка (или, например, gridspec). В принятом ответе, который вы связываете, цветная полоса также не такая высокая, как оси, поэтому все же необходимы некоторые корректировки. - person tiago; 04.03.2015

Возможно, вы заранее не знаете диапазоны своих данных, но вы можете знать, что они каким-то образом совместимы. В этом случае вы можете позволить matplotlib выбирать эти диапазоны для первого графика и использовать тот же диапазон для остальных графиков. Вот как это сделать. Ключ в том, чтобы получить пределы с properties()['clim']

import numpy as np
import matplotlib.pyplot as plt

my_image1 = np.linspace(0, 10, 10000).reshape(100,100)
my_image2 = np.sqrt(my_image1.T) + 3

fig, axes = plt.subplots(nrows=1, ncols=2)
im = axes[0].imshow(my_image1)
clim=im.properties()['clim']
axes[1].imshow(my_image2, clim=clim)

fig.colorbar(im, ax=axes.ravel().tolist(), shrink=0.5)

plt.show()
person Ramon Crehuet    schedule 03.03.2017
comment
Это не сработает, если диапазон значений на первом графике меньше диапазона на втором графике. - person naught101; 15.01.2018
comment
Согласованный. Но это то, что я объяснил в тексте. Это сработает, если вы не знаете лучших диапазонов, но предполагаете, что автоматические диапазоны для первого графика будут соответствовать оставшимся. - person Ramon Crehuet; 19.01.2018
comment
@ naught101 Опоздание всего на ~ 3 года, но ниже мое решение этой проблемы: найти общие минимальные и максимальные значения, которые можно использовать как vmin и vmax в imshow. - person airdas; 21.12.2020

Когда диапазоны наборов данных (data1 и data2) неизвестны, и вы хотите использовать одну и ту же цветовую полосу для обоих / всех графиков, найдите общий минимум и максимум для использования в качестве vmin и vmax в вызове imshow:

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=1, ncols=2)

# generate randomly populated arrays
data1 = np.random.rand(10,10)*10 
data2 = np.random.rand(10,10)*10 -7.5

# find minimum of minima & maximum of maxima
minmin = np.min([np.min(data1), np.min(data2)])
maxmax = np.max([np.max(data1), np.max(data2)])

im1 = axes[0].imshow(data1, vmin=minmin, vmax=maxmax,
                     extent=(-5,5,-5,5), aspect='auto', cmap='viridis')
im2 = axes[1].imshow(data2, vmin=minmin, vmax=maxmax,
                     extent=(-5,5,-5,5), aspect='auto', cmap='viridis')

# add space for colour bar
fig.subplots_adjust(right=0.85)
cbar_ax = fig.add_axes([0.88, 0.15, 0.04, 0.7])
fig.colorbar(im2, cax=cbar_ax)

Двойной график imshow с одной цветовой полосой

person airdas    schedule 21.12.2020