Построение pcolormesh с кучей двумерных массивов разного цвета

вот мой вопрос

Извините за сумбурное выражение.

Просто проверьте мое обновление. Это более ясно.

1. Введение

  • Трехмерный массив data в форме (10, 31, 37).
  • Первое измерение 10 - это количество двумерных массивов.
  • Последние 2 массива представляют некоторое значение сетки двумерной области со значением 0 и 1.

Это выглядит так:

### mask the value 0 of data[1,:,:]
data_mask = np.ma.masked_less(data[[1,:,:],0.001)
pc =plt.pcolor(xx,yy,data_mask[i,:,:],alpha =1,facecolor = "pink",edgecolor = 'steelblue',zorder =3)
## plotting the grid line
mesh =plt.pcolor(xx,yy,data[1,:,:],cmap="gray",alpha =0.45,facecolor = "none",edgecolor = 'k')       

Извините, Китай не разрешает мне использовать imgur
(источник: tietuku.com)

2. Моя попытка

  • Построение каждого двумерного массива разным цветом на одной фигуре
  • Если возможно нарисовать часть поперечного сечения другим цветом (например, диаграмма Венна) или типом заливки (штриховка), :


(источник: tietuku.com)

3. Мой код

Например, два двумерных массива.

(источник: tietuku.com)

cs=plt.cm.jet(np.arange(2)/2.)     
for i in range(0,2,1):
    data_mask = np.ma.masked_less(data[i,:,:],0.001)
    plt.pcolor(xx,yy, data_mask[i,:,:],alpha =0.95,facecolor = cs[i],edgecolor = 'k',zorder =3)      

результат

(источник: tietuku.com)

На этих рисунках всем казалось, что настройка цвета была неправильной.

4. Мой вопрос

  1. Как установить цвет сетки pcolor? В моем примере использование facecolor = не сработало. И я знаю, что использование cmap = plt.cm.xxx работает (рисунок ниже). Но я должен построить эти два двумерных массива отдельно.


(источник: tietuku.com)

  1. Как я сказал в разделе 'Моя попытка 2', есть ли способ засвидетельствовать перекрытие и пометить эту сетку каким-то умным способом.

Что я могу понять, так это создать еще один np.array с именем «перекрытие» и сохранить информацию о каждой сетке.

for i in range(0,data.shape[1],1):
    for j in range(0,dat.shape[2],1):
        if (data[0,i,j] == 1) & (data[1,i,j] == 1.0):
            overlap[i,j] = 1       

При наличии более двух двумерных массивов этот метод не справлялся.

Обновление -2016-01-17

Я суммирую свой вопрос в одну цифру с кодом, который его генерирует:

cover_mask = np.ma.masked_less(data[0,:,:],0.001)
plt.pcolor(xx,yy,data_mask[0,:,:],cmap = plt.cm.Set1,alpha =0.75,\
           edgecolor = 'k',zorder =3)      

cover_mask = np.ma.masked_less(cov[1,:,:],0.001)       
plt.pcolor(xx,yy,cover_mask[1,:,:],cmap = plt.cm.Set2,alpha =0.75,\
           edgecolor = 'k',zorder =3)          

http://i4.tietuku.com/1d47a3410417cd4f.png

Мой вопрос

  1. В приведенном выше коде я рисую двумерные массивы отдельно. Если цвет сетки можно установить с помощью facecolor = 'cs[i]' с cs=plt.cm.xxx(np.arange(2)/2.) , я могу зациклить все свои данные[0:10,:,:]. Но я могу использовать только cmap = xxx, чтобы различать цвет каждого массива. Я не знаю, как зациклить палитру.

  2. На картинке выше красные сетки и зеленые сетки перекрываются. Для лучшего эффекта визуализации я хочу пометить эти перекрывающиеся сетки зачеркнутыми.

Идея 1

  • каждая двумерная сетка имеет разные цвета, и все перекрывающиеся области имеют один и тот же цвет (в моем случае требуется 11 цветов)

Идея 2

пометьте перекрывающуюся сетку знаком «X» или чем-то подобным, как показано на рисунке ниже.


(источник: tietuku.com)

Добавлять

Основываясь на этом сообщении, кажется, что "pcolor/pcolormesh" не имеет функция настройки hatch = '* '.


person Han Zhengzu    schedule 17.01.2016    source источник
comment
Есть 10 массивов 2d, поэтому вам нужно 2 ** 10 цветов для представления перекрытия. Это то, что вы хотите?   -  person HYRY    schedule 17.01.2016


Ответы (2)


Отказ от ответственности: я раньше не использовал цветные графики numpy.

Тем не менее, я думаю, что вижу, в чем ваша проблема. Из документации cmap:

Обычно экземпляры Colormap используются для преобразования значений данных (с плавающей запятой) из интервала [0, 1] в цвет RGBA, который представляет соответствующая Colormap.

Я считаю, что проблема в том, что вы устанавливаете все значения сетки равными 1, а затем все значения перекрытия также равны 1. Таким образом, в cmap они оказываются одного цвета. Если вы хотите, чтобы они были разных цветов, они должны иметь разные значения. Или, если вы хотите, чтобы какое-то значение между ними использовалось с плавающей запятой от 0 до 1. Установка всех значений одного массива на 1, а другого на 0, с ячейками перекрытия, установленными на 0,5, даст вам цвета на противоположном конце cmap с помощью ячейки перекрытия представляют собой смесь обоих (при условии, что вы используете двухцветную cmap). Пересмотрено:

for i in range(0,data.shape[1],1):
    for j in range(0,dat.shape[2],1):
        #assuming you've set one array to 0 and the other to 1
        overlap[0, i, j] = abs(data[0, i, j] / data[1, i, j) / 2 
        #if (data[0,i,j] == 1) & (data[1,i,j] == 1.0)
            #overlap[i,j] = 1

Надеюсь, что ответил на ваш вопрос, это было немного запутанно. Я ценю всю информацию, которую вы предоставили, но четкое заявление «Это именно то, что неправильно» в начале определенно поможет понять проблему. И эй, дайте мне знать, если это исправит это, потому что мне интересно.

person ktbiz    schedule 17.01.2016
comment
Спасибо, если я разобрался. Я опубликую его по этому вопросу и дам вам знать. - person Han Zhengzu; 17.01.2016
comment
хорошо, я вижу ваш обновленный вопрос. Я думаю, вы хотите установить значение одного массива равным 0, а другого массива равным 1. Затем перекрытие должно быть установлено равным 0,5 или некоторому промежуточному значению. Я думаю, что это должно сделать перекрытие смесью двух цветов (в зависимости от cmap), при этом исходные объекты будут цветами противоположных концов cmap. Лучше, чем альфа-решение, я думаю. - person ktbiz; 17.01.2016

Если вы хотите установить для перекрывающихся ячеек только один цвет, тогда работает следующий код:

import numpy as np
import pylab as pl
from matplotlib import colors

data = (np.random.rand(3, 5, 10) > 0.8).astype(np.int)
cdata = (data * np.arange(1, 4)[:, None, None]).sum(axis=0)
overlap = data.sum(axis=0) > 1
cdata[overlap] = 4

y, x = np.mgrid[:6, :11]

cmap = colors.ListedColormap(["w", "r", "g", "b", "k"])
pl.pcolormesh(x, y, cdata, edgecolor="black", cmap=cmap)

Суть в том, чтобы вызвать pcolormesh() только один раз и использовать объект ListedColormap cmap для установки цвета каждой ячейки, вот результат:

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

цвета массивов — «r», «g», «b», а цвет перекрытия — черный. Вот содержание данных:

array([[[0, 0, 0, 1, 0, 1, 0, 0, 1, 0],
        [0, 0, 0, 0, 1, 0, 1, 0, 0, 0],
        [0, 0, 1, 0, 0, 0, 1, 1, 0, 0],
        [1, 1, 0, 0, 0, 0, 1, 0, 0, 0],
        [0, 0, 0, 1, 0, 0, 0, 1, 0, 0]],

       [[0, 0, 0, 1, 1, 0, 1, 1, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
        [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
        [1, 1, 1, 0, 0, 0, 1, 0, 0, 0]],

       [[0, 0, 0, 0, 0, 0, 1, 1, 0, 0],
        [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 1, 0, 0, 0, 1],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]])
person HYRY    schedule 17.01.2016