Как я могу создать стандартную цветовую полосу для серии графиков в python

Я использую matplotlib для построения некоторых данных в python, и для графиков требуется стандартная цветная полоса. Данные состоят из серии матриц NxM, содержащих информацию о частоте, поэтому простой график imshow() дает двумерную гистограмму с цветом, описывающим частоту. Каждая матрица содержит данные в разных, но перекрывающихся диапазонах. Imshow нормализует данные в каждой матрице в диапазоне 0-1, что означает, что, например, график матрицы A будет выглядеть идентичным графику матрицы 2*A (хотя цветная полоса будет отображать двойные значения). Я бы хотел, чтобы красный цвет, например, соответствовал одной и той же частоте на всех графиках. Другими словами, одной цветной полосы будет достаточно для всех графиков. Любые предложения будут ценны.


person user1010845    schedule 24.10.2011    source источник
comment
Я предпочитаю использовать matshow() или pcolor(), потому что imshow() сглаживает матрицу при отображении, что затрудняет интерпретацию. Поэтому, если матрица действительно не является изображением, я предлагаю вам попробовать две другие.   -  person Christian Alis    schedule 25.10.2011
comment
@inalis — вы можете указать interpolation='nearest' при использовании imshow, если вам не нужна интерполяция. pcolor намного медленнее, чем imshow для больших массивов, поэтому часто лучше использовать imshow для больших массивов. С другой стороны, pcolor дает векторный вывод, что иногда может быть очень удобно.   -  person Joe Kington    schedule 25.10.2011
comment
возможный дубликат Matplotlib 2 подграфика, 1 цветная полоса   -  person Ruggero Turra    schedule 03.03.2015


Ответы (4)


Не для того, чтобы украсть ответ @ianilis, но я хотел добавить пример...

Есть несколько способов, но самый простой — просто указать kwargs vmin и vmax для imshow. В качестве альтернативы вы можете создать экземпляр matplotlib.cm.Colormap и указать его, но это сложнее, чем необходимо для простых случаев.

Вот быстрый пример с одной цветовой полосой для всех изображений:

import numpy as np
import matplotlib.pyplot as plt

# Generate some data that where each slice has a different range
# (The overall range is from 0 to 2)
data = np.random.random((4,10,10))
data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None]

# Plot each slice as an independent subplot
fig, axes = plt.subplots(nrows=2, ncols=2)
for dat, ax in zip(data, axes.flat):
    # The vmin and vmax arguments specify the color limits
    im = ax.imshow(dat, vmin=0, vmax=2)

# Make an axis for the colorbar on the right side
cax = fig.add_axes([0.9, 0.1, 0.03, 0.8])
fig.colorbar(im, cax=cax)

plt.show()

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

person Community    schedule 24.10.2011

Самое простое решение — вызвать clim(lower_limit, upper_limit) с одинаковыми аргументами для каждого графика.

person Christian Alis    schedule 24.10.2011

Это только ответ на половину вопроса, а точнее начало нового. Если вы измените

data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None]

to

data *= np.array([2.0, 1.0, 1.5, 0.5])[:,None,None]

ваша цветовая полоса будет меняться от 0 до 0,5, которая в данном случае от темно-синего до слегка светло-синего и не будет охватывать весь диапазон (от 0 до 2). На цветовой полосе будут отображаться только цвета из последнего изображения или контура независимо от vmin и vmax.

person robert    schedule 22.07.2016

Меня не устраивали решения, которые предлагали вручную устанавливать vmin и vmax, поэтому я решил прочитать пределы каждого графика и автоматически установить vmin и vmax.

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

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid
import numpy as np

numberOfPlots = 3
data = []
for i in range(numberOfPlots):
    mean = i
    data.append(np.random.normal(mean, size=(100,100)))

fig = plt.figure()
grid = ImageGrid(fig, 111, nrows_ncols=(1,numberOfPlots), cbar_mode='single')
ims = []
for i in range(numberOfPlots):
    ims.append(grid[i].imshow(data[i]))
    grid[i].set_title("Mean = " + str(i))

clims = [im.get_clim() for im in ims]
vmin = min([clim[0] for clim in clims])
vmax = max([clim[1] for clim in clims])
for im in ims:
    im.set_clim(vmin=np.floor(vmin),vmax=np.ceil(vmax))
grid[0].cax.colorbar(ims[0]) # with cbar_mode="single", cax attribute of all axes are identical    

fig.show()

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

person toliveira    schedule 19.04.2018