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

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

相关推荐
liu****8 小时前
LangChain-AI应用开发框架(七)
人工智能·python·langchain·大模型应用·本地部署大模型
hhcgchpspk8 小时前
网速上传下载流量监测工具尝试
网络·python·cmd·psutil
ada0_ada18 小时前
qt模块学习记录
开发语言·qt·学习
liulilittle8 小时前
C++ 无锁编程:单停多发送场景高性能方案
服务器·开发语言·c++·高性能·无锁·原子
飞Link9 小时前
大模型时代的“语言编程”:Prompt Engineering (提示词工程) 深度解析与实战指南
开发语言·python·prompt
无限进步_9 小时前
【C++】巧用静态变量与构造函数:一种非常规的求和实现
开发语言·c++·git·算法·leetcode·github·visual studio
Advancer-9 小时前
RedisTemplate 两种序列化实践方案
java·开发语言·redis
郝学胜-神的一滴9 小时前
Socket实战:从单端聊天到多用户连接的实现秘籍
服务器·开发语言·python·网络协议·pycharm
zzwq.9 小时前
线程池与进程池:concurrent.futures高效并发
python
小超超爱学习99379 小时前
大数乘法,超级简单模板
开发语言·c++·算法