Python如何绘制土地利用图和类型转移桑基图
针对城市资源监测与空间数据分析需求,本文介绍如何使用Python结合GeoPandas、Matplotlib与Plotly库,读取地理数据文件,快速生成本土化土地利用类型分布图、面积占比统计图以及多年份土地转移桑基图。文中提供完整可运行代码、核心参数说明及结果验证方法。
核心工具与数据准备
绘制土地利用与覆盖类型图主要依赖空间数据处理与可视化组件。操作前需在终端执行安装命令:
pip install pandas geopandas matplotlib plotly
空间数据通常以.geojson或.shp格式存储,内部需包含表示用地分类的字段(如land_use_type)。非空间统计数据可使用.csv文件,字段需包含类别名称与对应数值。
第1步:读取空间数据并生成土地利用分布图
该步骤的目标是将矢量面数据渲染为二维分类地图。核心在于正确加载文件并指定分类字段映射颜色。
import geopandas as gpd
import matplotlib.pyplot as plt
# 1. 读取地理数据
data = gpd.read_file('land_use.geojson')
# 2. 验证数据结构(打印前5行确认字段存在)
print(data.head())
# 3. 初始化画布
fig, ax = plt.subplots(1, 1, figsize=(12, 10))
# 4. 按指定列绘制分类图
data.plot(
column='land_use_type',
ax=ax,
legend=True,
legend_kwds={'label': "Land Use Types", 'orientation': "horizontal"},
cmap='Set3'
)
# 5. 添加标注并展示
ax.set_title('Land Use and Land Cover Types Map', fontsize=15)
ax.set_xlabel('Longitude', fontsize=12)
ax.set_ylabel('Latitude', fontsize=12)
plt.show()参数column决定用于分组的字段名,cmap控制配色方案。运行后若终端报错FileNotFoundError,请检查工作目录是否包含对应文件;若图形空白,需确认数据框内land_use_type列无大量空值。
第2步:统计各覆盖类型占比(饼图与柱状图)
当需要横向对比不同类别的面积或数量时,饼图适合展示比例关系,柱状图适合展示绝对频数。此处以静态数据与CSV加载为例演示。
import pandas as pd
import matplotlib.pyplot as plt
# 饼状图:展示面积比例
data_pie = {
'类型': ['森林', '农田', '城市', '水体', '草地'],
'面积_km2': [150, 320, 100, 50, 80]
}
df_pie = pd.DataFrame(data_pie)
df_pie['比例'] = df_pie['面积_km2'] / df_pie['面积_km2'].sum()
plt.figure(figsize=(8, 6))
plt.pie(df_pie['比例'], labels=df_pie['类型'], autopct='%.1f%%', startangle=140)
plt.title('土地利用类型面积占比')
plt.axis('equal')
plt.show()
# 柱状图:展示覆盖类型频次(假设已读取CSV)
# df_csv = pd.read_csv('land_cover_data.csv')
# counts = df_csv['cover_type'].value_counts()
# plt.figure(figsize=(10, 6))
# plt.bar(counts.index, counts.values)
# plt.title('Land Cover Distribution')
# plt.xlabel('Cover Type')
# plt.ylabel('Count')
# plt.show()饼图通过autopct自动计算百分比,startangle调整起始角度提升可读性。柱状图依赖value_counts()进行分组计数,适用于处理非几何类型的统计报表。
第3步:构建2014至2024年土地利用转移桑基图
桑基图专门用于呈现多状态间的流转量。通过定义转移矩阵与节点布局,可直观反映十年间各类用地的演变轨迹。
import plotly.graph_objects as go
# 转移矩阵(行代表2014年类别,列代表2024年类别)
transfer_matrix = [
[383.69, 3.51, 0.02, 7.19, 4.27, 0.24],
[8.66, 166.07, 1.44, 63.02, 17.73, 39.24],
[0.0, 0.88, 3.73, 0.09, 0.01, 0.23],
[12.76, 29.42, 1.1, 79.35, 11.97, 25.42],
[0.27, 3.73, 0.03, 1.64, 1.72, 0.94],
[2.14, 4.39, 0.05, 11.69, 1.15, 2.75]
]
categories = ["林地", "建设用地", "水域", "耕地", "未利用地", "草地"]
# 拼接首尾年份标签
labels = [f"2014_{c}" for c in categories] + [f"2024_{c}" for c in categories]
source, target, value = [], [], []
for i in range(len(categories)):
for j in range(len(categories)):
if transfer_matrix[i][j] > 0:
source.append(i)
target.append(len(categories) + j)
value.append(transfer_matrix[i][j])
colors = ["#228B22", "#D2691E", "#1E90FF", "#FFD700", "#A9A9A9", "#8FBC8F"]
node_colors = colors * 2
fig = go.Figure(data=[go.Sankey(
node=dict(pad=15, thickness=20, line=dict(color="black", width=0.5),
label=labels, color=node_colors),
link=dict(source=source, target=target, value=value)
)])
fig.update_layout(title_text="2014年至2024年土地利用类型转移桑基图", font_size=10)
fig.show()代码通过双层循环遍历矩阵,仅提取大于零的流向数据以精简链路。node_colors采用列表扩展实现首尾同色对齐。运行环境需保持网络通畅或配置代理以便下载Plotly前端资源。
完成判断与排错建议
执行上述流程后,可通过以下状态确认任务完成:
- 空间图核对:
plt.show()弹出窗口显示带图例的分类多边形,且颜色按Set3调色板均匀分布。 - 统计图核对:饼图总和严格等于100%,柱状图X轴标签与CSV分类一一对应,无错位或重叠。
- 桑基图核对:左侧节点按2014年排序,右侧按2024年排序,连线粗细与矩阵数值正相关,支持鼠标悬停查看具体流转量。
常见排错路径:
- 字段找不到(KeyError):打开GeoJSON或CSV,确认实际列名是否与代码
column='...'完全一致(含大小写与空格)。 - 坐标系统警告(UserWarning: CRS undefined):Geopandas默认赋予
EPSG:4326投影。若底图偏移严重,需先使用data.crs = "EPSG:xxx"绑定源坐标系,或调用data.to_crs()统一变换。 - 中文乱码/方块:在绘图前插入
plt.rcParams['font.sans-serif'] = ['SimHei']并配合plt.rcParams['axes.unicode_minus'] = False解决字体渲染问题。
总结
利用Python生态中的GeoPandas与Matplotlib组合,能够轻量级完成土地利用类型面的快速渲染与基础统计;搭配Plotly交互组件,则可深入挖掘多年份土地转移规律。掌握read_file读取、column映射与矩阵解析逻辑后,即可替换占位数据接入实际GIS项目。以上就是利用Python生成土地利用图和类型转移桑基图的详细内容,更多关于Python地理数据可视化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













