GeoPandas绘图样式太丑怎么办?GIS地图出图优化技巧(附:配色方案)

ArcPy
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

《GeoPandas绘图样式太丑怎么办?GIS地图出图优化技巧(附:配色方案)》这篇文章面向已经会用 GeoPandas 画地图、但导出的专题图看起来“像默认截图”的 GIS 学习者和分析人员。我们不追求复杂制图系统,而是用 GeoPandas、Matplotlib 和少量参数,把一张可读性差的地图优化成适合报告、论文初稿、项目汇报和数据分析说明的 GIS 出图。

引言:为什么 GeoPandas 绘图样式太丑

很多同学第一次用 GeoPandas 绘图时,代码可能只有一行:

gdf.plot()

这确实能快速看数据,但默认结果通常会出现几个问题:颜色随机、边界线过粗或过黑、图例不清楚、坐标轴干扰阅读、地图比例失衡、中文标题显示异常。于是就会产生一个常见问题:GeoPandas 绘图样式太丑怎么办?

本质上,GeoPandas 的 plot() 是基于 Matplotlib 的快速制图接口。它适合数据探索,不等于自动完成专业地图设计。想让 GeoPandas 地图更好看,需要从配色、分类、边界、图例、版式和导出参数几个方面一起调整。

GeoPandas绘图样式太丑怎么办 GeoPandas地图出图优化技巧
GeoPandas 默认绘图与优化后专题图的效果对比。

背景:GeoPandas 地图出图常见问题

在 GIS 项目中,GeoPandas 经常用于行政区划统计图、点位分布图、缓冲区分析结果图、空间连接统计图和栅格矢量叠加后的结果展示。它的优势是和 Python 数据分析流程衔接非常顺畅,但默认绘图并不会自动处理制图表达。

常见的难看原因包括:

  • 颜色没有语义:数值大小、分类含义和颜色深浅不匹配。
  • 分类方式不合适:连续变量直接渐变,导致局部差异看不出来。
  • 边界线太抢眼:行政区边界压过了填充色,地图显得脏。
  • 图例不规范:图例标题、单位、位置和数字格式没有整理。
  • 坐标轴没有关闭:经纬度刻度在专题图中经常显得多余。
  • 投影不合适:经纬度坐标下绘制面积、距离类结果,视觉比例可能失真。
  • 导出分辨率太低:在 Word、PPT 或网页中放大后变糊。

所以,GeoPandas 地图出图优化不是简单换一个颜色,而是把“数据可视化”和“GIS 制图表达”结合起来。

原理:GeoPandas 绘图优化要控制哪些参数

GeoPandas 的 GeoDataFrame.plot() 主要负责把几何对象画到 Matplotlib 的坐标轴上。你可以把它理解为:GeoPandas 管空间数据,Matplotlib 管画布、标题、图例、字体、导出。

优化一张 GeoPandas 地图,通常要控制以下几类参数:

  • 字段:使用 column 指定专题图字段。
  • 颜色:使用 cmap 指定连续或分级色带。
  • 分类:使用 schemeclassification_kwds 控制分级方式。
  • 边界:使用 edgecolorlinewidth 控制线条。
  • 缺失值:使用 missing_kwds 避免空值区域被误读。
  • 图例:使用 legendlegend_kwds 调整图例表达。
  • 画布:使用 Matplotlib 的 figsizeax.set_axis_off()savefig() 控制版式和导出。

如果需要使用 scheme 做自然断点、分位数等分级,通常还需要安装 mapclassify

pip install mapclassify

步骤:GeoPandas 地图出图优化完整流程

步骤一:读取数据并检查坐标系

下面以行政区统计图为例。假设数据是一个带有统计字段 value 的 GeoPackage、Shapefile 或 GeoJSON。

import geopandas as gpd
import matplotlib.pyplot as plt

gdf = gpd.read_file("data/city_stat.gpkg")

print(gdf.crs)
print(gdf.head())
print(gdf["value"].describe())

如果你的地图用于面积、距离或密度表达,不建议直接使用 EPSG:4326 经纬度坐标进行分析和制图。可以根据研究区选择合适投影坐标系。仅用于普通行政区展示时,经纬度也能画,但比例和面积视觉需要谨慎解释。

# 示例:转换到 Web Mercator,仅作演示
# 实际项目应选择适合研究区的本地投影坐标系
gdf = gdf.to_crs(epsg=3857)

步骤二:先画一张默认图,确认数据没有问题

在优化样式之前,先用最简单的方式检查几何和字段是否正常。

gdf.plot(column="value", legend=True)
plt.show()

这一步不要急着美化。先确认以下内容:

  • 行政区是否完整显示。
  • 是否有明显错位、飞线或空洞。
  • value 字段是否存在异常值。
  • 空值区域是否需要单独标注。

步骤三:选择适合 GIS 专题图的配色方案

配色是 GeoPandas 绘图样式优化中最容易见效的一步。不同数据类型应使用不同色带:

数据类型 推荐色带 适用场景
由低到高的连续数值 YlOrRdOrRdBluesGreens 人口、GDP、密度、强度、风险等级
正负偏离 RdBucoolwarmPiYG 增长率、残差、变化量、冷热差异
分类数据 Set2Pastel1tab20 土地利用类型、功能区、行政类别
强调高值区域 YlOrBrRedsmagma 灾害风险、污染浓度、热点强度
冷静专业风格 viridiscividisBlues 论文图、技术报告、数据产品说明

如果你不确定怎么选,优先使用 viridiscividis。它们对色盲用户相对友好,明暗变化也比较稳定。

步骤四:使用分级制图,而不是直接连续渐变

很多 GIS 专题图需要分级表达。比如人口密度、建筑数量、灾害风险值,如果直接用连续渐变,读者很难判断每个区域属于哪个等级。

GeoPandas 可以配合 mapclassify 使用 scheme 参数:

fig, ax = plt.subplots(1, 1, figsize=(9, 7))

gdf.plot(
    column="value",
    ax=ax,
    cmap="YlOrRd",
    scheme="Quantiles",
    k=5,
    legend=True,
    edgecolor="#ffffff",
    linewidth=0.4,
    legend_kwds={
        "title": "统计值分级",
        "loc": "lower left"
    }
)

ax.set_title("行政区统计值分布图", fontsize=16, pad=12)
ax.set_axis_off()

plt.tight_layout()
plt.show()

scheme="Quantiles" 表示分位数分级,每一级包含的要素数量接近。它适合展示空间差异,但可能让数值间隔不均匀。如果你希望等级断点更贴近数据自然分布,可以尝试 NaturalBreaks

gdf.plot(
    column="value",
    ax=ax,
    cmap="YlOrRd",
    scheme="NaturalBreaks",
    k=5,
    legend=True
)

步骤五:优化边界线,让地图更干净

默认边界线往往太黑、太粗。行政区专题图中,边界线应该辅助识别区域,而不是抢走颜色表达的注意力。

推荐设置:

  • 浅色填充图:使用白色或浅灰边界。
  • 深色填充图:使用半透明浅灰边界。
  • 小尺度密集多边形:降低 linewidth,避免地图变成线网。
gdf.plot(
    column="value",
    cmap="Blues",
    edgecolor="#f7f7f7",
    linewidth=0.3,
    legend=True,
    ax=ax
)

如果边界对业务判断很重要,可以单独叠加一层边界:

gdf.plot(column="value", cmap="YlGnBu", linewidth=0, ax=ax)
gdf.boundary.plot(ax=ax, color="#666666", linewidth=0.4)

步骤六:处理缺失值,避免读者误判

GeoPandas 地图出图时,缺失值区域如果没有明确样式,读者可能会误以为它是低值区。建议用浅灰色并在图例中说明。

gdf.plot(
    column="value",
    cmap="YlOrRd",
    legend=True,
    missing_kwds={
        "color": "#eeeeee",
        "edgecolor": "#cccccc",
        "hatch": "///",
        "label": "无数据"
    },
    ax=ax
)

在正式出图前,最好检查缺失值数量:

print(gdf["value"].isna().sum())

步骤七:关闭坐标轴,设置标题和注记

多数专题图不需要显示坐标轴刻度。关闭坐标轴可以显著提升地图成图感。

ax.set_axis_off()
ax.set_title("行政区统计值分布图", fontsize=16, pad=12)

如果需要在图中说明数据来源,可以使用 Matplotlib 添加文本。注意不要把说明写得太长。

ax.text(
    0.01, 0.02,
    "数据来源:示例数据;制图:GeoPandas",
    transform=ax.transAxes,
    fontsize=9,
    color="#666666"
)

步骤八:设置中文字体,避免标题乱码

很多 GeoPandas 中文地图难看的原因不是配色,而是中文字体显示成方框或乱码。可以在脚本开头设置 Matplotlib 中文字体。

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei", "Arial Unicode MS"]
plt.rcParams["axes.unicode_minus"] = False

不同系统可用字体不同。如果在 Linux 服务器上批量出图,建议先安装中文字体,并用 Matplotlib 的字体管理功能确认字体可用。

步骤九:导出高清图片

不要直接截图。正式用于报告、PPT 或网页时,应使用 savefig() 导出。

plt.savefig(
    "output/geopandas_map.png",
    dpi=300,
    bbox_inches="tight",
    facecolor="white"
)

常用导出建议:

  • 网页文章:PNG,宽度控制在合理范围,背景白色。
  • 论文或报告:PNG 300 dpi 起步,必要时导出 PDF 或 SVG。
  • PPT:PNG 或 SVG,注意文字不要太小。
  • 印刷:优先矢量格式,检查字体嵌入和颜色模式。

步骤十:完整示例代码

下面是一段相对完整的 GeoPandas 地图出图优化代码,可以作为模板修改。

import geopandas as gpd
import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei", "Arial Unicode MS"]
plt.rcParams["axes.unicode_minus"] = False

gdf = gpd.read_file("data/city_stat.gpkg")

# 根据项目需要选择合适投影;这里仅示例
if gdf.crs is not None:
    gdf = gdf.to_crs(epsg=3857)

fig, ax = plt.subplots(1, 1, figsize=(9, 7))

gdf.plot(
    column="value",
    ax=ax,
    cmap="YlOrRd",
    scheme="NaturalBreaks",
    k=5,
    legend=True,
    edgecolor="#ffffff",
    linewidth=0.4,
    missing_kwds={
        "color": "#eeeeee",
        "edgecolor": "#cccccc",
        "hatch": "///",
        "label": "无数据"
    },
    legend_kwds={
        "title": "统计值分级",
        "loc": "lower left"
    }
)

ax.set_title("行政区统计值分布图", fontsize=16, pad=12)
ax.text(
    0.01, 0.02,
    "数据来源:示例数据;制图:GeoPandas",
    transform=ax.transAxes,
    fontsize=9,
    color="#666666"
)

ax.set_axis_off()
plt.tight_layout()

plt.savefig(
    "output/geopandas_map.png",
    dpi=300,
    bbox_inches="tight",
    facecolor="white"
)

plt.show()

常见坑:GeoPandas 绘图样式优化时容易忽略的问题

坑一:只换色带,不检查数据分布

如果数据存在极端值,普通渐变色会被少数高值拉伸,导致大部分区域颜色差异很弱。此时应先查看统计分布,再决定是否使用分级、对数变换或异常值处理。

print(gdf["value"].describe())
print(gdf["value"].quantile([0.25, 0.5, 0.75, 0.9, 0.95]))

坑二:经纬度数据直接做面积颜色图

如果你的 value 是面积、密度或距离计算结果,必须确认计算过程是否在合适的投影坐标系中完成。经纬度坐标单位是度,不适合直接做精确面积和距离计算。

坑三:行政区边界太密,图面发黑

县级、乡镇级边界非常密集时,边界线稍微粗一点就会让地图变脏。可以减少线宽,或者只叠加上级行政边界。

坑四:分类色带用于连续变量

Set2Pastel1tab20 适合类别字段,不适合表达数值大小。连续数值应使用有明显明暗顺序的色带,例如 BluesYlOrRdviridis

坑五:图例数字太长

如果图例中出现很多小数位,读者会很难快速理解。可以在制图前生成简化后的字段,或者对数值进行单位换算。

gdf["value_wan"] = gdf["value"] / 10000

坑六:导出后图片边缘被裁切

如果标题、图例或注记被裁切,可以使用 bbox_inches="tight",并适当调整 figsize、图例位置和标题间距。

方法比较:GeoPandas、QGIS 和 ArcGIS Pro 出图怎么选

方法 优点 局限 适合场景
GeoPandas + Matplotlib 可批量、可复现、能和 Python 数据分析无缝结合 交互式排版能力较弱,复杂制图元素需要手动写代码 批量专题图、数据分析报告、自动化出图
QGIS 制图界面友好,符号系统成熟,布局管理器强 批量自动化需要额外配置或 PyQGIS 正式地图排版、课程作业、项目汇报图
ArcGIS Pro 制图和空间分析体系完整,布局和标注能力强 授权成本较高,自动化依赖 ArcPy 环境 生产级制图、单位项目成果、复杂地图册
GeoPandas + Contextily 可以快速叠加底图,适合城市点位和轨迹展示 需要 Web Mercator,底图版权和联网环境要注意 Web 风格展示图、点位分布图、路线图

如果只是做一次正式地图排版,QGIS 或 ArcGIS Pro 更省心。如果你需要每周、每天甚至按区县批量生成同一套图,GeoPandas 地图出图优化的价值就很高。

检查清单:发布前快速检查 GeoPandas 地图出图质量

  • 是否确认 gdf.crs,并在需要时转换到合适投影?
  • 专题字段是否存在空值、极端值或单位混乱?
  • 色带是否符合数据含义,而不是随便选择?
  • 连续变量是否需要分级表达?
  • 边界线是否过粗、过黑或过密?
  • 图例是否包含标题、单位和清晰等级?
  • 无数据区域是否单独显示?
  • 中文标题和注记是否正常显示?
  • 坐标轴是否需要关闭?
  • 导出图片是否使用足够的 dpi
  • 图片放入 Word、PPT 或网页后是否仍然清晰?

FAQ:GeoPandas 绘图样式太丑的常见问题

GeoPandas 绘图样式太丑,是不是不适合正式出图?

不是。GeoPandas 默认图主要用于快速查看数据,所以看起来比较朴素。只要合理设置配色、分类、边界、图例和导出参数,GeoPandas 可以生成质量不错的分析图和报告图。但如果需要复杂标注、比例尺、指北针、地图整饰和多图框排版,QGIS 或 ArcGIS Pro 会更方便。

GeoPandas 地图出图优化最先改哪个参数?

建议先改三项:cmapedgecolorlinewidth。这三项会立刻影响地图观感。然后再处理 scheme、图例、标题、缺失值和导出分辨率。

GeoPandas 配色方案怎么选比较稳?

连续数值优先选 viridiscividisBluesYlOrRd。分类数据可以选 Set2Pastel1。如果表达正负变化,可以选 RdBucoolwarm。不要用分类色带表达连续大小关系。

为什么我的 GeoPandas 中文标题显示方框?

这是 Matplotlib 没有找到可用中文字体导致的。可以设置 plt.rcParams["font.sans-serif"],并确认系统中安装了 SimHei、Microsoft YaHei、Arial Unicode MS 等字体。在服务器或 Docker 环境中,尤其要注意安装字体文件。

GeoPandas 可以添加底图吗?

可以,常用方法是配合 contextily。但底图通常使用 Web Mercator 投影,因此你的 GeoDataFrame 通常需要转换为 EPSG:3857。同时要注意底图服务的访问权限、版权和网络环境。

GeoPandas 导出图片为什么很模糊?

通常是因为使用了默认分辨率,或者直接截图。建议使用 plt.savefig(),设置 dpi=300,并使用 bbox_inches="tight"。如果需要后期编辑,可以考虑导出 SVG 或 PDF。

结论:让 GeoPandas 地图好看的关键不是“美化”,而是规范制图

GeoPandas 绘图样式太丑,通常不是工具本身的问题,而是默认绘图缺少 GIS 制图设计。只要按“检查数据和坐标系、选择合适配色、使用合理分级、弱化边界、整理图例、关闭多余坐标轴、高清导出”这条流程处理,GeoPandas 地图出图质量会明显提升。

对于 GIS 学生和初级工程师来说,建议先掌握一套稳定模板,再根据不同专题字段替换色带和分级方式。这样既能保持结果可复现,又能让地图在报告、论文和项目汇报中更清晰、更专业。