Как я могу создать дискретную цветовую полосу, используя карту цветов из mpl_toolkits.basemap.cm?

Когда я строю график pcolormesh, использую цветовую карту from matplotlib.cm (например, "jet", "Set2" и т. д.), я могу использовать:

 cMap = plt.cm.get_cmap("jet",lut=6)    

Цветовая шкала выглядит следующим образом:

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

Но если я хочу вызвать цветовую карту из пакета Basemap (например, GMT_drywet, GMT_no_green и т. д.). Я не могу использовать plt.cm,get_cmap, чтобы получить эти палитры и разделить их.

Есть ли у mpl_toolkits.basemap.cm функция, похожая на lut?


person Han Zhengzu    schedule 03.01.2016    source источник
comment
К какому графику вы пытаетесь добавить цветную полосу? Не могли бы вы показать MCVE?   -  person ali_m    schedule 03.01.2016
comment
Вы можете сделать это с помощью частного метода _resample на объектах карты цветов. Не совсем уверен, почему этот метод является закрытым....   -  person tacaswell    schedule 03.01.2016


Ответы (2)


Пока график, который вы делаете, имеет дискретные значения цвета (например, contour или contourf), тогда colorbar должен автоматически генерировать цветовую полосу с дискретными шагами. Вот график, основанный на первом примере из basemap документации:

from mpl_toolkits.basemap import Basemap, cm
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1, 1)
ax.hold(True)

map = Basemap(projection='ortho',lat_0=45,lon_0=-100,resolution='l')
map.drawcoastlines(linewidth=0.25)
map.drawcountries(linewidth=0.25)
map.fillcontinents(color='coral',lake_color='aqua')
map.drawmapboundary(fill_color='aqua')
map.drawmeridians(np.arange(0,360,30))
map.drawparallels(np.arange(-90,90,30))

nlats = 73; nlons = 145; delta = 2.*np.pi/(nlons-1)
lats = (0.5*np.pi-delta*np.indices((nlats,nlons))[0,:,:])
lons = (delta*np.indices((nlats,nlons))[1,:,:])
wave = 0.75*(np.sin(2.*lats)**8*np.cos(4.*lons))
mean = 0.5*np.cos(2.*lats)*((np.sin(2.*lats))**2 + 2.)
x, y = map(lons*180./np.pi, lats*180./np.pi)

map.contourf(x,y,wave+mean,15, alpha=0.5, cmap=cm.GMT_drywet)
cb = map.colorbar()
plt.show()

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

person ali_m    schedule 03.01.2016
comment
Спасибо! Но когда я использую график типа pcolor/pcolormesh, он не работает. - person Han Zhengzu; 04.01.2016
comment
Это связано с тем, что pcolor отображает данные с использованием непрерывно меняющейся цветовой карты, а не дискретных уровней. Было бы полезно, если бы вы отредактировали свой вопрос, чтобы более четко объяснить, какой результат вы ищете, и показать код, который вы в настоящее время используете для создания своего графика. - person ali_m; 04.01.2016

Расширение @tacaswell's comment выше, вы можете добиться той же функциональности, используя метод _resample. Это создаст сегментированные цветовые карты для графиков pcolor/pcolormesh, которые не генерируют цветные полосы с дискретным шагом, такие как contourf. Чтобы добиться того же эффекта, что и с струей в вашем вопросе:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import cm
plt.figure()
cmap = cm.GMT_drywet._resample(6)
pm = plt.pcolormesh(np.random.rand(10,8), cmap=cmap)
plt.colorbar(pm, orientation='horizontal')
plt.show()

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

person Dan    schedule 30.06.2017