Как нарисовать imshow в два цвета? - PullRequest
1 голос
/ 23 января 2020

Это простая версия моего кода

m=10
n=40
z=np.random.uniform(0,1,(m,n))
plt.imshow(z,cmap='Greys')  
plt.colorbar()

Это вывод

enter image description here


Это то, что я пытаюсь сделать

Я хочу, чтобы каждый второй столбец был красным, а остальные - синим, как я могу это сделать?

Я пробовал это, но это дает ошибка

for i in range(n):  
if (np.mod(i,2)==1):  
   plt.imshow(z[:,i],cmap='Blues')  
else :  
    plt.imshow(z[:,i],cmap='Reds')
ERROR: Invalid shape (10,) for image data

Ответы [ 2 ]

2 голосов
/ 23 января 2020
m=10
n=40
z=np.random.random(size=(m,n))
z1 = np.full(z.shape, np.nan)
z2 = np.full(z.shape, np.nan)
z1[:,::2] = z[:,::2]
z2[:,1::2] = z[:,1::2]
plt.imshow(z1,cmap='Reds')
plt.imshow(z2,cmap='Blues')

enter image description here

1 голос
/ 23 января 2020

Однако нет смысла добавлять цветовую шкалу на график ...

Мы наносим массив дважды, каждый раз заменяя некоторые столбцы на np.nan, и это работает, потому что Matplotlib обычно не наносит чернила на график, когда встречается NaN.

In [40]: m=8 
    ...: n=16 
    ...: z=np.random.uniform(0,1,(m,n)) 
    ...: for i, cm  in zip((0, 1), ('Blues', 'Reds')): 
    ...:     x = np.copy(z) 
    ...:     x[:,range(i, n, 2)] = np.nan 
    ...:     plt.imshow(x, cmap=cm)                                                       
    ...: plt.colorbar()                 

enter image description here

Вышеприведенное можно обобщить до n_cm различных цветовых карт

def multi_imshow(image, cm_list, ax=None, **kwd): 
    nrows, ncols = image.shape 
    n_cm = len(cm_list) 
    for i, cm in enumerate(cm_list): 
        cols = range(i, ncols, n_cm) 
        x = np.full(image.shape, np.nan) 
        x[:,cols] = image[:,cols] 
        if ax: 
            ax.imshow( x, cmap=cm, **kwd) 
        else: 
            plt.imshow(x, cmap=cm, **kwd) 

image = np.arange(16*21, dtype=float).reshape(16,21)
multi_imshow(image, ('Reds_r', 'Blues_r', 'Blues'))

enter image description here

...