Как я могу создать стандартную цветовую панель для серии графиков в Python - PullRequest
37 голосов
/ 24 октября 2011

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

Ответы [ 4 ]

73 голосов
/ 24 октября 2011

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

Есть несколько способов, но самый простой - просто указать vmin и vmax kwargs для 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()

enter image description here

9 голосов
/ 24 октября 2011

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

2 голосов
/ 22 июля 2016

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

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

до

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

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

0 голосов
/ 19 апреля 2018

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

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...