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

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

相关推荐
m0_743470372 小时前
C++中的桥接模式变体
开发语言·c++·算法
IT猿手2 小时前
MATLAB画四旋翼无人机,机翼可独立旋转
开发语言·matlab·无人机
96772 小时前
java数据类型解析以及相关八股文的题 String 到底是基本类型还是引用类型?
java·开发语言·python
会编程的土豆2 小时前
【影院管理系统】
开发语言
瞎某某Blinder2 小时前
DFT学习记录[5]电子结构分析+光学分析
linux·python·科技·学习·生活·matplotlib·帅哥
gulinigar2 小时前
C++中的观察者模式实战
开发语言·c++·算法
星空露珠2 小时前
迷你世界UGC3.0脚本Wiki对象模块管理接口 GameObject
开发语言·数据库·算法·游戏·lua
困死,根本不会2 小时前
蓝桥杯 Python 备考全攻略:从入门到进阶的学习路线
笔记·python·学习·算法·蓝桥杯
yuyu_03042 小时前
AI识别手部异常
python·ai