2013-11-10 3 views
2

Я ищу для построения matplotlib colormesh поверх другого colormesh. Нижний график - это просто оттенки серого.Дискретизированная цветовая карта с прозрачностью в Matplotlib

Тот, который сидит сверху, должен, однако, нарисовать прозрачный квадрат, когда значение переданного массива равно 0, и другой цвет для каждого другого числа в переданном массиве. Это 2d массивы numpy.

В настоящее время у меня есть:

plt.pcolormesh(array1, vmin = -32, vmax = 32, cmap = plt.cm.binary) 
plt.pcolormesh(array2, cmap = plt.cm.spectral) 

Очевидно, что это не дает то, что я ищу, и я предполагаю, что способ сделать это, чтобы сформировать свою собственную палитру, я прочитал это руководство: http://wiki.scipy.org/Cookbook/Matplotlib/ColormapTransformations, но это не похоже на прозрачность, а также на то, как сделать конкретные значения привязаны к определенным цветам.

В короткий пример того, что я хотел бы, массив:

[[0, 1] 
[2, 3]] 

Если производить сетку выглядит как:

[[transparent, red 
[green, yellow]] 

Как я могу идти об этом? Объединение массивов вместе не является вариантом, так как нижний набор данных представляет собой карту высот, и значения этого, вероятно, всегда будут охватывать значения второго массива (это идентификаторы агентов).

ответ

1

Этот код должен сделать что-то похожее на то, что вам требуется:

Редактировать с помощью masked_array:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
import matplotlib.colors as colors 
import numpy.ma as ma 

#See http://stackoverflow.com/questions/18926031/how-to-extract-a-subset-of-a-colormap-as-a-new-colormap-in-matplotlib 
def truncate_colormap(cmap, minval=0.0, maxval=1.0, n=100): 
    new_cmap = colors.LinearSegmentedColormap.from_list(
     'trunc({n},{a:.2f},{b:.2f})'.format(n=cmap.name, a=minval, b=maxval), 
     cmap(np.linspace(minval, maxval, n))) 
    return new_cmap 

#truncate the colourmap 
n_colours = 4 
new_cmap = truncate_colormap(cm.get_cmap('spectral_r'), 0, 0.4, n=n_colours) 

#discretise the colourmap 
bounds = np.linspace(0,n_colors,n_colours+1) 
norm = colors.BoundaryNorm(bounds, new_cmap.N) 

#build array one 
array1 = np.random.rand(10,10) 

#build array two 
array2 = np.random.randint(0,5,100).reshape(10,10) 

#mask the array 
array2 = ma.masked_array(array2, array2==0) 

#plot it 
plt.pcolormesh(array1,cmap = plt.cm.binary) 
plt.pcolormesh(array2,cmap = new_cmap, norm=norm) 
cbar = plt.colorbar() 
plt.show() 

Вот новый выход, используя замаскированный массив:

enter image description here

+0

Это хорошо, и близко к тому, что я имел в виду, но не совсем там. Возможно ли применять альфа-канал ТОЛЬКО к тем значениям 0? Если нет, я думаю, мне, возможно, придется искать другой способ построения этих данных. –

+1

Да, используя маскированные массивы, это сделает. Отредактировано мое сообщение, чтобы продемонстрировать. – dabillox

+0

Блестящий, спасибо. Чтобы увеличить количество используемых цветов, я просто изменяю параметр n в truncate_colormap? - Кажется, это связано с предоставленной ссылкой. –

Смежные вопросы