Я хочу использовать imshow (например) для отображения некоторых данных внутри границ страны (для примера я выбрал США). Простой пример ниже иллюстрирует то, что я хочу:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import RegularPolygon
data = np.arange(100).reshape(10, 10)
fig = plt.figure()
ax = fig.add_subplot(111)
im = ax.imshow(data)
poly = RegularPolygon([ 0.5, 0.5], 6, 0.4, fc='none',
ec='k', transform=ax.transAxes)
im.set_clip_path(poly)
ax.add_patch(poly)
ax.axis('off')
plt.show()
Результат:
Теперь я хочу сделать это, но вместо простого многоугольника я хочу использовать сложную форму США. Я создал несколько примеров данных, содержащихся в массиве «Z», как показано в приведенном ниже коде. Именно эти данные я хочу отобразить с помощью цветовой карты, но только в пределах материковой части США.
Пока что пробовал следующее. Я получаю файл формы здесь, содержащийся в файле "nationp010g.shp.tar. gz "и я использую модуль Basemap в Python для построения США. Обратите внимание, что это единственный найденный мной метод, который дает мне возможность получить многоугольник в нужной мне области. Если есть альтернативные методы, меня тоже заинтересуют. Затем я создаю многоугольник с именем mainpoly, который является почти тем многоугольником, который я хочу покрасить в синий цвет:
Обратите внимание, как было окрашено только одно тело, все остальные непересекающиеся многоугольники остались белыми:
Так что область, окрашенная в синий цвет, - это почти то, что я хочу, обратите внимание, что рядом с Канадой есть нежелательные границы, потому что граница на самом деле проходит через некоторые озера, но это небольшая проблема. Настоящая проблема в том, почему мои данные imshow не отображаются внутри США? Сравнивая мой первый и второй примеры кода, я не понимаю, почему я не получаю обрезанное imshow во втором примере, как в первом. Любая помощь будет оценена в понимании того, что мне не хватает.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap as Basemap
from matplotlib.patches import Polygon
# Lambert Conformal map of lower 48 states.
m = Basemap(llcrnrlon=-119,llcrnrlat=22,urcrnrlon=-64,urcrnrlat=49,
projection='lcc',lat_1=33,lat_2=45,lon_0=-95)
shp_info = m.readshapefile('nationp010g/nationp010g', 'borders', drawbounds=True) # draw country boundaries.
for nshape,seg in enumerate(m.borders):
if nshape == 1873: #This nshape denotes the large continental body of the USA, which we want
mainseg = seg
mainpoly = Polygon(mainseg,facecolor='blue',edgecolor='k')
nx, ny = 10, 10
lons, lats = m.makegrid(nx, ny) # get lat/lons of ny by nx evenly space grid.
x, y = m(lons, lats) # compute map proj coordinates.
Z = np.zeros((nx,ny))
Z[:] = np.NAN
for i in np.arange(len(x)):
for j in np.arange(len(y)):
Z[i,j] = x[0,i]
ax = plt.gca()
im = ax.imshow(Z, cmap = plt.get_cmap('coolwarm') )
im.set_clip_path(mainpoly)
ax.add_patch(mainpoly)
plt.show()
Обновлять
Я понимаю, что линия
ax.add_patch(mainpoly)
не добавляет даже многоугольника к графику. Я не правильно использую? Насколько мне известно, mainpoly правильно рассчитывалась с использованием метода Polygon (). Я проверил, что ввод координат разумный:
plt.plot(mainseg[:,0], mainseg[:,1] ,'.')
который дает