Контур базовой карты внутри нескольких фигур

Я пытаюсь нанести на карту интерполированные данные о погоде только в пределах городов, содержащихся в шейп-файле. Ниже показан необрезанный контур базовой карты с импортированным шейп-файлом: Контур, наложенный на базовую карту с шейп-файлом

Я попытался обрезать коллекции контуров, перебирая коллекции контуров следующим образом:

m.readshapefile('data/grense', 'grense',zorder=10,linewidth=1, 
drawbounds=True)

patches   = []
for info, shape in zip(m.grense_info, m.grense):
   patches.append( Polygon(np.array(shape), linestyle=':', fill=False) )

for poly in patches:
   for collection in cs.collections:
      collection.set_clip_path(poly)

Это, очевидно, ограничивает контур одним полигоном, то есть одним городом, например: /а>

Можно ли создать коллекцию коллекций контуров, которую я могу затем добавить с помощью ax.add_collection(new_contour_collection)? Что-то вроде:

for poly in patches:
   for collection in cs.collections:
     contour_collection.append(collection)
ax.add_collection(contour_collection)

Или я могу создать один путь из коллекции исправлений, а затем обрезать каждую из коллекций контуров, используя collection.set_clip_patch(patches)?


person Stef Marais    schedule 10.12.2018    source источник
comment
Если вам нужна только визуализация, постройте contourf ниже zorder. Затем нарисуйте заполненные полигоны с более высоким zorder, чтобы скрыть ненужные части contourf.   -  person swatchai    schedule 12.12.2018
comment
Посмотрите, поможет ли это.   -  person Thomas Kühn    schedule 13.12.2018
comment
Очень красивое решение. Пожалуйста, подумайте о том, чтобы опубликовать решение как ответ на свой вопрос и принять его. Таким образом, другие увидят, что ваша проблема не нуждается в дальнейшем внимании (и это может принести вам несколько голосов).   -  person Thomas Kühn    schedule 14.12.2018
comment
О, снэп, я новичок во всем этом. Я обновлю соответственно.   -  person Stef Marais    schedule 15.12.2018


Ответы (1)


После предложения swatchai и предыдущий ответ Томаса Кюна здесь, мне удалось решить мою проблему, видел здесь маскированная интерполяция,

выполнив следующие действия:

#Combine shapefile shape object (m.grense) with map edges
##limits of the map:
x0,x1 = ax.get_xlim()
y0,y1 = ax.get_ylim()
map_edges = np.array([[x0,y0],[x1,y0],[x1,y1],[x0,y1]])

polys = [map_edges] + m.grense

codes = [
    [Path.MOVETO] + [Path.LINETO for p in p[1:]]
    for p in polys
]
polys_lin = [v for p in polys for v in p]
codes_lin = [c for cs in codes for c in cs]
path = Path(polys_lin, codes_lin)

#Important - Set Zorder greater than Contour and less than Map 
borders
patch = PathPatch(path,facecolor='white', lw=0, zorder =2)

##masking the data:
ax.add_patch(patch)
person Stef Marais    schedule 15.12.2018