探索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的经纬度剖面图。这里我简单做了示例,调整细节后会更好看的。

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

相关推荐
峥嵘life7 小时前
Android16 311Y3 EAP-TLS 网络连接失败分析与修复总结
android·开发语言·人工智能·php
jufeng130710 小时前
【系列:手搓自主 AI Agent:Hermes 架构原理剖析 · 第 11 篇】
python·ai agent·mcp
mqiqe10 小时前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
gugucoding10 小时前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
En^_^Joy10 小时前
Django项目配置全攻略:settings配置文件
后端·python·django
Nebula_g10 小时前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
for_ever_love__11 小时前
python基础语法学习: 异常的传递性
开发语言·python·学习
AC赳赳老秦11 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
依然鸣11 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论