Geopandas实操:为shapefile生成的地图中特定集群设置自定义颜色
实现思路
不需要额外创建子图,所有绘制操作都可以在同一个轴对象上完成,核心逻辑是筛选出目标集群对应的GeoDataFrame子集,或者预先生成颜色映射列后统一绘图。
以下是两种可直接复用的实现方案,假设你的GeoDataFrame命名为gdf_de,包含cluster_id(集群标识列)、power_output(发电量列)、geometry(地理边界列)三个核心字段。
方案1:预生成颜色列(更简洁)
先根据集群属性生成专属颜色列,绘图时直接传入该列即可:
import geopandas as gpd import matplotlib.pyplot as plt from matplotlib.patches import Patch # 读取shapefile gdf_de = gpd.read_file("你的shapefile文件路径.shp") # 自定义配色:最高发电量集群用红色,最低用蓝色,其余用浅灰 COLOR_MAX = "#d62728" COLOR_MIN = "#1f77b4" COLOR_OTHER = "#f0f0f0" # 替换为你实际查到的最高/最低发电量对应的集群名称/ID MAX_CLUSTER = "集群A" MIN_CLUSTER = "集群B" # 生成绘图颜色列 def assign_color(row): if row["cluster_id"] == MAX_CLUSTER: return COLOR_MAX elif row["cluster_id"] == MIN_CLUSTER: return COLOR_MIN else: return COLOR_OTHER gdf_de["plot_color"] = gdf_de.apply(assign_color, axis=1) # 绘图 fig, ax = plt.subplots(figsize=(10, 8)) gdf_de.plot( color=gdf_de["plot_color"], edgecolor="white", # 州边界设为白色,提升区分度 ax=ax ) # 可选:添加自定义图例 legend_items = [ Patch(facecolor=COLOR_MAX, label="最高发电量集群"), Patch(facecolor=COLOR_MIN, label="最低发电量集群"), Patch(facecolor=COLOR_OTHER, label="其他集群") ] ax.legend(handles=legend_items, loc="lower right") plt.axis("off") # 可选:隐藏坐标轴 plt.show()
方案2:分批次绘制(灵活度更高)
适合需要给目标集群单独设置特殊样式的场景,比如加粗边界、调整透明度等:
import geopandas as gpd import matplotlib.pyplot as plt gdf_de = gpd.read_file("你的shapefile文件路径.shp") MAX_CLUSTER = "集群A" MIN_CLUSTER = "集群B" fig, ax = plt.subplots(figsize=(10, 8)) # 先绘制所有非目标集群 gdf_de[~gdf_de["cluster_id"].isin([MAX_CLUSTER, MIN_CLUSTER])].plot( color="#f0f0f0", edgecolor="white", ax=ax ) # 绘制最高发电量集群,可单独设置样式 gdf_de[gdf_de["cluster_id"] == MAX_CLUSTER].plot( color="#d62728", edgecolor="black", linewidth=1.2, ax=ax ) # 绘制最低发电量集群 gdf_de[gdf_de["cluster_id"] == MIN_CLUSTER].plot( color="#1f77b4", edgecolor="black", linewidth=1.2, ax=ax ) plt.axis("off") plt.show()
注意事项
- 如果你是直接按发电量数值判断而非集群ID判断,把判断条件里的
cluster_id替换为发电量列即可,比如if row["power_output"] == max_power_value - 所有
plot方法都传入同一个ax对象即可保证所有地理要素绘制在同一张图上,不需要创建多个子图
内容的提问来源于stack exchange,提问作者Cha26
相关产品推荐
相关产品推荐

