GeoPandas绘图样式太丑怎么办?GIS地图出图优化技巧(附:配色方案)
《GeoPandas绘图样式太丑怎么办?GIS地图出图优化技巧(附:配色方案)》这篇文章面向已经会用 GeoPandas 画地图、但导出的专题图看起来“像默认截图”的 GIS 学习者和分析人员。我们不追求复杂制图系统,而是用 GeoPandas、Matplotlib 和少量参数,把一张可读性差的地图优化成适合报告、论文初稿、项目汇报和数据分析说明的 GIS 出图。
引言:为什么 GeoPandas 绘图样式太丑
很多同学第一次用 GeoPandas 绘图时,代码可能只有一行:
gdf.plot()
这确实能快速看数据,但默认结果通常会出现几个问题:颜色随机、边界线过粗或过黑、图例不清楚、坐标轴干扰阅读、地图比例失衡、中文标题显示异常。于是就会产生一个常见问题:GeoPandas 绘图样式太丑怎么办?
本质上,GeoPandas 的 plot() 是基于 Matplotlib 的快速制图接口。它适合数据探索,不等于自动完成专业地图设计。想让 GeoPandas 地图更好看,需要从配色、分类、边界、图例、版式和导出参数几个方面一起调整。

背景:GeoPandas 地图出图常见问题
在 GIS 项目中,GeoPandas 经常用于行政区划统计图、点位分布图、缓冲区分析结果图、空间连接统计图和栅格矢量叠加后的结果展示。它的优势是和 Python 数据分析流程衔接非常顺畅,但默认绘图并不会自动处理制图表达。
常见的难看原因包括:
- 颜色没有语义:数值大小、分类含义和颜色深浅不匹配。
- 分类方式不合适:连续变量直接渐变,导致局部差异看不出来。
- 边界线太抢眼:行政区边界压过了填充色,地图显得脏。
- 图例不规范:图例标题、单位、位置和数字格式没有整理。
- 坐标轴没有关闭:经纬度刻度在专题图中经常显得多余。
- 投影不合适:经纬度坐标下绘制面积、距离类结果,视觉比例可能失真。
- 导出分辨率太低:在 Word、PPT 或网页中放大后变糊。
所以,GeoPandas 地图出图优化不是简单换一个颜色,而是把“数据可视化”和“GIS 制图表达”结合起来。
原理:GeoPandas 绘图优化要控制哪些参数
GeoPandas 的 GeoDataFrame.plot() 主要负责把几何对象画到 Matplotlib 的坐标轴上。你可以把它理解为:GeoPandas 管空间数据,Matplotlib 管画布、标题、图例、字体、导出。
优化一张 GeoPandas 地图,通常要控制以下几类参数:
- 字段:使用
column指定专题图字段。 - 颜色:使用
cmap指定连续或分级色带。 - 分类:使用
scheme和classification_kwds控制分级方式。 - 边界:使用
edgecolor和linewidth控制线条。 - 缺失值:使用
missing_kwds避免空值区域被误读。 - 图例:使用
legend和legend_kwds调整图例表达。 - 画布:使用 Matplotlib 的
figsize、ax.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 绘图样式优化中最容易见效的一步。不同数据类型应使用不同色带:
| 数据类型 | 推荐色带 | 适用场景 |
|---|---|---|
| 由低到高的连续数值 | YlOrRd、OrRd、Blues、Greens |
人口、GDP、密度、强度、风险等级 |
| 正负偏离 | RdBu、coolwarm、PiYG |
增长率、残差、变化量、冷热差异 |
| 分类数据 | Set2、Pastel1、tab20 |
土地利用类型、功能区、行政类别 |
| 强调高值区域 | YlOrBr、Reds、magma |
灾害风险、污染浓度、热点强度 |
| 冷静专业风格 | viridis、cividis、Blues |
论文图、技术报告、数据产品说明 |
如果你不确定怎么选,优先使用 viridis 或 cividis。它们对色盲用户相对友好,明暗变化也比较稳定。
步骤四:使用分级制图,而不是直接连续渐变
很多 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 是面积、密度或距离计算结果,必须确认计算过程是否在合适的投影坐标系中完成。经纬度坐标单位是度,不适合直接做精确面积和距离计算。
坑三:行政区边界太密,图面发黑
县级、乡镇级边界非常密集时,边界线稍微粗一点就会让地图变脏。可以减少线宽,或者只叠加上级行政边界。
坑四:分类色带用于连续变量
Set2、Pastel1、tab20 适合类别字段,不适合表达数值大小。连续数值应使用有明显明暗顺序的色带,例如 Blues、YlOrRd、viridis。
坑五:图例数字太长
如果图例中出现很多小数位,读者会很难快速理解。可以在制图前生成简化后的字段,或者对数值进行单位换算。
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 地图出图优化最先改哪个参数?
建议先改三项:cmap、edgecolor、linewidth。这三项会立刻影响地图观感。然后再处理 scheme、图例、标题、缺失值和导出分辨率。
GeoPandas 配色方案怎么选比较稳?
连续数值优先选 viridis、cividis、Blues、YlOrRd。分类数据可以选 Set2 或 Pastel1。如果表达正负变化,可以选 RdBu 或 coolwarm。不要用分类色带表达连续大小关系。
为什么我的 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 学生和初级工程师来说,建议先掌握一套稳定模板,再根据不同专题字段替换色带和分级方式。这样既能保持结果可复现,又能让地图在报告、论文和项目汇报中更清晰、更专业。