Python Geopandas技术问题:从欧洲地图中排除法属圭亚那
解决Geopandas绘制欧洲地图时排除法属圭亚那的问题
naturalearth_lowres里的法国条目是复合多边形,包含欧洲本土和法属圭亚那等海外领地,直接按continent == 'Europe'筛选没法分离两者。你可以通过拆分法国的几何图形,只保留欧洲区域的部分来解决:
修改后的完整代码
import geopandas as gpd import pandas as pd import matplotlib.pyplot as plt from shapely.geometry import MultiPolygon # 读取基础数据 europe = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')) # 1. 先筛选出除法国外的欧洲国家 europe_no_france = europe[(europe.continent == 'Europe') & (europe.name != 'France')] # 2. 单独处理法国:拆分复合多边形,只保留欧洲区域的部分 france = europe[europe.name == 'France'].copy() # 拆分MultiPolygon为单个Polygon france_polygons = [] for geom in france.geometry: if isinstance(geom, MultiPolygon): for poly in geom.geoms: # 欧洲大致范围:纬度高于40°N(法属圭亚那在赤道附近,纬度低) if poly.centroid.y > 40: france_polygons.append(poly) # 重新组合成MultiPolygon france_clean = gpd.GeoDataFrame( france.drop('geometry', axis=1), geometry=[MultiPolygon(france_polygons)], crs=europe.crs ) # 3. 合并处理后的法国和其他欧洲国家 europe = pd.concat([europe_no_france, france_clean], ignore_index=True) # 读取并合并通胀数据 data = pd.read_csv('HICP_EU_bycountry_12_2022.csv', delimiter=';') data = data[['Area', 'Rate']] merged_data = europe.merge(data, left_on='name', right_on='Area', how='left') # 绘图部分不变 fig, ax = plt.subplots(figsize=(10, 6)) merged_data.plot(column='Rate', cmap='Reds', linewidth=0.8, ax=ax, edgecolor='0.8', legend=True) ax.set_title('Inflation Rates in Europe', fontsize=16) ax.set_axis_off() for idx, row in merged_data.iterrows(): rate = row['Rate'] if not pd.isna(rate): ax.annotate(text=str(rate), xy=row['geometry'].centroid.coords[0], horizontalalignment='center', fontsize=8) ax.set_facecolor('#f7f7f7') plt.show()
关键说明
- 拆分法国的MultiPolygon时,用纬度大于40°N作为筛选条件,因为法属圭亚那位于赤道附近(纬度约2°N),而法国本土纬度都在40°以上,这个简单的条件就能准确分离两者。
- 如果需要更精确的范围,可以结合经度(欧洲经度大致在-10°到30°E之间)进一步筛选。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

