Как получить pcolor для отображения значений NaN в белом цвете при использовании картопии? - PullRequest
0 голосов
/ 23 апреля 2019

Я строю некоторые целочисленные метки на карте океана, используя cartopy и pcolor в python.Я бы хотел, чтобы значения NaN отображались в виде белых пятен.Однако в настоящее время значения NaN строятся с использованием самого низкого цвета в цветовой карте.Как я могу получить pcolor для отображения значений NaN белым?

Вот пример карты, где pcolor отображает значения NaN с использованием цвета вместо белого

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

import numpy as np
import matplotlib as mpl
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
from random import seed
from random import randint

## set maximum number of integer labels
n_comp = 4

# generate random integer "labels" as example data 
seed(1)
labels = np.zeros((128*64,1))
for ncomp in range(0, 64*128-1):
    labels[ncomp] = randint(0, n_comp)

# make array 2D for plotting
labels2D = labels.reshape((128,64))

# replace zero with nan
labels2D[labels2D==0] = np.nan

# create latitude / longitude data
x = np.arange(0.0,360.0,2.815)
xx = np.tile(x,[64,1])
xx = xx.transpose()
y = np.arange(-90,90,2.815)
yy = np.tile(y,[128,1])

# create figure and axes
fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(1, 1, 1, 
                     projection=ccrs.Robinson(central_longitude=-150))

# create colormap 
cmap=plt.get_cmap('Accent', n_comp+1)

# use white color to mark 'bad' values
cmap.set_bad(color='w')

# use norm to define colormap
boundaries = np.arange(0.5,n_comp+1,1)
norm = mpl.colors.BoundaryNorm(boundaries, cmap.N, clip=True)

# use pcolor to make label map
labelMap = ax.pcolor(xx, yy, labels2D,
                     transform=ccrs.PlateCarree(), 
                     norm=norm, 
                     cmap=cmap,
                     vmin = 1,
                     vmax = n_comp)

# add continents on top of label data
ax.add_feature(cfeature.LAND, zorder=1, edgecolor='black')

# plot colorbar with ticks at centres of bars
plt.colorbar(labelMap, ticks=np.arange(1,n_comp+1,1))

# show plot 
plt.show()

Я бы хотел, чтобы значения NaN были обозначены белым цветом, но в настоящее время они отображаются цветом из цветовой карты.Заранее благодарим за любую помощь / руководство.

1 Ответ

1 голос
/ 23 апреля 2019

Ваш код работает для меня, я получаю значения белого вместо цвета.

Я использую numpy 1.15.0, mpl 2.2.2 и cartopy 0.16.0

на маке.

...