Я использую matplotlib для построения некоторых данных в python, и для графиков требуется стандартная цветная полоса. Данные состоят из серии матриц NxM, содержащих информацию о частоте, поэтому простой график imshow() дает двумерную гистограмму с цветом, описывающим частоту. Каждая матрица содержит данные в разных, но перекрывающихся диапазонах. Imshow нормализует данные в каждой матрице в диапазоне 0-1, что означает, что, например, график матрицы A будет выглядеть идентичным графику матрицы 2*A (хотя цветная полоса будет отображать двойные значения). Я бы хотел, чтобы красный цвет, например, соответствовал одной и той же частоте на всех графиках. Другими словами, одной цветной полосы будет достаточно для всех графиков. Любые предложения будут ценны.
Как я могу создать стандартную цветовую полосу для серии графиков в python
Ответы (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()
Самое простое решение — вызвать clim(lower_limit, upper_limit) с одинаковыми аргументами для каждого графика.
Это только ответ на половину вопроса, а точнее начало нового. Если вы измените
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
.
Меня не устраивали решения, которые предлагали вручную устанавливать 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()
interpolation='nearest'
при использованииimshow
, если вам не нужна интерполяция.pcolor
намного медленнее, чемimshow
для больших массивов, поэтому часто лучше использоватьimshow
для больших массивов. С другой стороны,pcolor
дает векторный вывод, что иногда может быть очень удобно. - person Joe Kington   schedule 25.10.2011