Я хочу создать 4 imshow
подсюжета, но все они имеют одну и ту же цветовую карту. Matplotlib автоматически регулирует масштаб цветовой карты в зависимости от записей матриц. Например, если в одной из моих матриц все элементы равны 10, а в другой все элементы равны 5, и я использую цветовую карту Greys
, тогда один из моих подзаголовков должен быть полностью черным, а другой - полностью серым. Но оба они в конечном итоге становятся полностью черными. Как сделать так, чтобы все подзаголовки имели одинаковый масштаб на цветовой карте?
Подзаголовки Imshow с той же цветовой полосой
Ответы (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()
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()
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)