Вы можете извлечь центр тяжести геометрии и нанести текст в этом месте:
import matplotlib.patheffects as PathEffects
for country in countries:
if country.attributes['SOVEREIGNT'] == "Bulgaria":
g = ax.add_geometries(country.geometry, ccrs.PlateCarree(), facecolor=(0, 1, 0), label="A")
x = country.geometry.centroid.x
y = country.geometry.centroid.y
ax.text(x, y, 'A', color='red', size=15, ha='center', va='center', transform=ccrs.PlateCarree(),
path_effects=[PathEffects.withStroke(linewidth=5, foreground="k", alpha=.8)])
else:
ax.add_geometries(country.geometry, ccrs.PlateCarree(), facecolor=(1, 1, 1), label = country.attributes['SOVEREIGNT'])
С экстентом, сфокусированным на «Болгария», это выглядит так:
edit:
Чтобы разделить "зависимости", рассмотрите возможность использования admin_0_map_units
вместо admin_0_map_countries
, см. Документацию Natural Earth .
Чтобы выделить небольшие страны / регионы, вы можете добавить буфер к геометрии, например:
highlight = ['Singapore', 'Liechtenstein']
for country in countries:
if country.attributes['NAME'] in highlight:
if country.geometry.area < 2:
geom = [country.geometry.buffer(2)]
else:
geom = [country.geometry]
g = ax.add_geometries(geom, ccrs.PlateCarree(), facecolor=(0, 0.5, 0, 0.6), label="A", zorder=99)
x = country.geometry.centroid.x
y = country.geometry.centroid.y
ax.text(x, y+5, country.attributes['NAME'], color='red', size=14, ha='center', va='center', transform=ccrs.PlateCarree(),
path_effects=[PathEffects.withStroke(linewidth=3, foreground="k", alpha=.8)])
else:
ax.add_geometries(country.geometry, ccrs.PlateCarree(), facecolor=(1, 1, 1), label=country.attributes['NAME'])
Вы можете разделить указанную c страну на что-то вроде этого. Он использует Shapely для выполнения пересечения в середине геометрии. В конечном счете, может быть «чище» разделить построение графиков и пространственный анализ (расщепление и т. Д. 1035 *) на более четкие этапы. Подобное смешивание, вероятно, затруднит повторное использование кода для других случаев.
from shapely.geometry import LineString, MultiLineString
for country in countries:
if country.attributes['NAME'] in 'China':
# line at the centroid y-coord of the country
l = LineString([(-180, country.geometry.centroid.y),
(180, country.geometry.centroid.y)])
north_poly = MultiLineString([l, north_line]).convex_hull
south_poly = MultiLineString([l, south_line]).convex_hull
g = ax.add_geometries([country.geometry.intersection(north_poly)], ccrs.PlateCarree(), facecolor=(0.8, 0.0, 0.0, 0.4), zorder=99)
g = ax.add_geometries([country.geometry.intersection(south_poly)], ccrs.PlateCarree(), facecolor=(0.0, 0.0, 0.8, 0.4), zorder=99)
x = country.geometry.centroid.x
y = country.geometry.centroid.y
ax.text(x, y, country.attributes['NAME'], color='k', size=16, ha='center', va='center', transform=ccrs.PlateCarree(),
path_effects=[PathEffects.withStroke(linewidth=5, foreground="w", alpha=1)], zorder=100)
else:
ax.add_geometries(country.geometry, ccrs.PlateCarree(), facecolor=(1, 1, 1), label=country.attributes['NAME'])