Я делаю график плотности ядра, но мои контуры простираются в области воды. У меня нет большого опыта в кодировании, но я использовал файл формы для построения своей "базовой карты". Однако я не уверен, как создать путь клипа из моего файла формы, чтобы обрезать контуры по краям страны. Будем очень благодарны за любые рекомендации по этому вопросу.
Я решил создать путь клипа, используя внешние границы моего шейп-файла.
Однако, когда я применил функцию set_clip_path к моим коллекциям контуров, вместо этого внутренние границы полигонов были обрезаны.
Вот суть кода, который я использовал.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.path as mpath
import matplotlib.patches as mpatches
import shapefile as shp
lon_lat_box = (-61.979370, -60.444031, 9.974261, 11.375031)
fig = plt.figure(figsize=(15,15))
ax1 = fig.add_subplot(1,1,1)
Path = mpath.Path
#read shape file
sfile = shp.Reader("./tto_adm0/TTO_adm0.shp")
#make clip path
for shape_rec in sfile.shapeRecords():
vertices = []
codes = []
pts = shape_rec.shape.points
prt = list(shape_rec.shape.parts) + [len(pts)]
for i in range(len(prt) - 1):
for j in range(prt[i], prt[i+1]):
vertices.append((pts[j][0], pts[j][1]))
codes += [Path.MOVETO]
codes += [Path.LINETO] * (prt[i+1] - prt[i] -2)
codes += [Path.CLOSEPOLY]
clip = mpath.Path(vertices, codes)
clip = mpatches.PathPatch(clip, facecolor = 'white')
#plot
ax1.add_patch(clip)
plt.xlim(lon_lat_box[0],lon_lat_box[1])
plt.ylim(lon_lat_box[2],lon_lat_box[3])
plot_map(shape_ex)
ax1.contourf(xx, yy, Z, cut, cmap="jet", alpha=0.3)
contour = ax1.contourf(xx, yy, Z, cut, cmap="jet", alpha=0.3)
C = plt.contourf(xx, yy, Z, cut, cmap="jet", alpha=0.3)
plt.colorbar(C)
for c in contour.collections:
c.set_clip_path(clip)
fig.savefig(pdf_name)
fig.show()
Вот как выглядит вывод прямо сейчас
Обновление:
Я понял, что линия «ax1.add_patch (clip)» просто маскирует всю заливку контура внутри границ страны, так как я установил цвет лица на белый.
Это означает, что контуры все еще не обрезаются с помощью созданного мной патча, и я не знаю почему.
Результат, если я удалил строку «ax1.add_patch (clip)», выглядит следующим образом: this
Обновление 2:
С предложением ImportanceOfBeingErnest я смог решить мою проблему и получить желаемый результат
В мой код были внесены следующие изменения:
contour = ax1.contourf(xx, yy, Z, cut, cmap="jet", alpha=0.3)
plt.colorbar(contour)
for c in contour.collections:
c.set_clip_path(clip)