Python如何绘制土地利用图和类型转移桑基图

小岛来信
小岛来信
发布时间:2026-10-11 | 2人浏览过
原创

针对城市资源监测与空间数据分析需求,本文介绍如何使用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年排序,连线粗细与矩阵数值正相关,支持鼠标悬停查看具体流转量。

常见排错路径:

  1. 字段找不到(KeyError):打开GeoJSON或CSV,确认实际列名是否与代码column='...'完全一致(含大小写与空格)。
  2. 坐标系统警告(UserWarning: CRS undefined):Geopandas默认赋予EPSG:4326投影。若底图偏移严重,需先使用data.crs = "EPSG:xxx"绑定源坐标系,或调用data.to_crs()统一变换。
  3. 中文乱码/方块:在绘图前插入plt.rcParams['font.sans-serif'] = ['SimHei']并配合plt.rcParams['axes.unicode_minus'] = False解决字体渲染问题。

总结

利用Python生态中的GeoPandas与Matplotlib组合,能够轻量级完成土地利用类型面的快速渲染与基础统计;搭配Plotly交互组件,则可深入挖掘多年份土地转移规律。掌握read_file读取、column映射与矩阵解析逻辑后,即可替换占位数据接入实际GIS项目。以上就是利用Python生成土地利用图和类型转移桑基图的详细内容,更多关于Python地理数据可视化的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表