You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:18:02