探索Python融合地学:绘制栅格数据经纬度剖面图

今天分享在python中绘制栅格经纬度剖面图的代码,这类图比较美观,在一些好的论文中也经常出现。

参考:https://doi.org/10.1111/gcb.15373

这里它绘制的是纬度方向的,显然经度是一样的原理,下面贴出代码。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
import rasterio
# === 全局字体设置 ===
plt.rcParams['font.family'] = 'Times New Roman'
# === 1. 读取栅格数据,请改为自己的栅格,使用WGS84地理坐标系最好 ===
path = r"G:\GEBCO-DEM.tif"
with rasterio.open(path) as src:
    wy = src.read(1)          # 读取第一个波段
    transform = src.transform
# 去除无效值(例如 -9999)
wy = np.where((wy < -1e10) | (wy > 1e10), np.nan, wy)
# =============================
# === 2. 绘制纬度方向分布 ===
# =============================
rows = np.arange(wy.shape[0])
lats = transform[5] + rows * transform[4]
# 如果纬度从南到北递增,则反转
if lats[0] < lats[-1]:
    lats = lats[::-1]
    wy = wy[::-1, :]
# 去除整行 NaN
valid_rows = ~np.all(np.isnan(wy), axis=1)
wy_lat = wy[valid_rows, :]
lats_valid = lats[valid_rows]
# 计算均值与标准差
mean_per_lat = np.nanmean(wy_lat, axis=1)
std_per_lat = np.nanstd(wy_lat, axis=1)
# 绘图
plt.figure(figsize=(3, 8*1.2))
plt.fill_betweenx(lats_valid,
                  mean_per_lat - std_per_lat,
                  mean_per_lat + std_per_lat,
                  color='lightblue', alpha=0.5)
plt.plot(mean_per_lat, lats_valid, color='red', linewidth=2)
overall_mean_lat = np.nanmean(wy_lat)
plt.axvline(overall_mean_lat, color='k', linestyle='--', linewidth=1)
# plt.text(overall_mean_lat + 0.02 * overall_mean_lat,
#          np.min(lats_valid) + 0.5,
#          f'Mean:\n{overall_mean_lat:.2f}',
#          fontsize=12, fontname='Times New Roman')
#plt.xlabel('DEM(m)', fontsize=14, fontname='Times New Roman')
# plt.xlabel('DEM(m)', fontsize=14, fontname='Times New Roman')
plt.ylabel('Latitude(°)', fontsize=14, fontname='Times New Roman')
plt.tick_params(labelsize=12)
min_wy = np.nanmin(wy_lat)
# max_wy = np.nanmax(wy_lat)
max_wy = 500
mid_wy = (min_wy + max_wy) / 2
plt.xticks([min_wy, mid_wy, max_wy], fontname='Times New Roman', fontsize=12)
plt.tight_layout()
plt.savefig(r'G:\latitude.jpg', dpi=400, bbox_inches='tight')
plt.show()
# =============================
# === 3. 绘制经度方向分布 ===
# =============================
cols = np.arange(wy.shape[1])
lons = transform[2] + cols * transform[0]
# 如果经度从东向西递减,则反转
if lons[0] > lons[-1]:
    lons = lons[::-1]
    wy = wy[:, ::-1]
# 去除整列 NaN
valid_cols = ~np.all(np.isnan(wy), axis=0)
wy_lon = wy[:, valid_cols]
lons_valid = lons[valid_cols]
# 计算均值与标准差
mean_per_lon = np.nanmean(wy_lon, axis=0)
std_per_lon = np.nanstd(wy_lon, axis=0)
# 绘图
plt.figure(figsize=(8*1.5, 3))
plt.fill_between(lons_valid,
                 mean_per_lon - std_per_lon,
                 mean_per_lon + std_per_lon,
                 color='lightblue', alpha=0.5)
plt.plot(lons_valid, mean_per_lon, color='red', linewidth=2)
overall_mean_lon = np.nanmean(wy_lon)
plt.axhline(overall_mean_lon, color='k', linestyle='--', linewidth=1)
# plt.text(np.min(lons_valid) + 0.5,
#          overall_mean_lon + 0.02 * overall_mean_lon,
#          f'Mean:\n{overall_mean_lon:.2f}',
#          fontsize=12, fontname='Times New Roman')
plt.xlabel('Longitude(°)', fontsize=14, fontname='Times New Roman')
#plt.ylabel('DEM(m)', fontsize=14, fontname='Times New Roman')
plt.tick_params(labelsize=12)
min_wy = np.nanmin(wy_lon)
max_wy = 500
# max_wy = np.nanmax(wy_lon)
mid_wy = (min_wy + max_wy) / 2
plt.yticks([min_wy, mid_wy, max_wy], fontname='Times New Roman', fontsize=12)
plt.tight_layout()
plt.savefig(r'G:\longitude.jpg', dpi=400, bbox_inches='tight')
plt.show()

该代码会同时绘制,经度方向和纬度方向的两个图,请调整代码中需要自定义的部分。

我绘制的是江西省的DEM ,在Arcgis中做好地图。然后将它们拼接,我们就可以得到江西省DEM的经纬度剖面图。这里我简单做了示例,调整细节后会更好看的。

这就是今天的分享,谢谢大家的支持,如果你觉得有用的话,请点击星标,关注我们的最新动态。我是加拿大一枝黄花,我们下期见。

相关推荐
大圣编蚕2 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
菜鸟~noob2332 小时前
【电子战】第02篇:能量检测器 vs. 相关检测器【含matlab代码】
开发语言·matlab
linweidong3 小时前
中科闻歌Java面试题及参考答案
java·python·大模型·提示词·ai agent·mcp·rag原理
OpenAnolis小助手3 小时前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom
小玮看世界3 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
萧鼎3 小时前
2026实战:用 tomlkit 优雅读写 TOML 配置,告别手写解析器
python·开源·教程·python库
ForteScarlet3 小时前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains
萧瑟余晖3 小时前
Java深入解析篇六十二之安全机制详解
java·开发语言
小刘在重生~3 小时前
Java 常用类|包装类 装箱拆箱、Integer 缓存面试题
java·python·缓存
2601_962099464 小时前
Python xlwt设置excel单元格字体及格式
python·excel·xlwt·样式设置·单元格格式