第八星系人气爱 发表于 2024-3-1 10:53:15

Python不同中心经纬度填色图

作者:第八星系-石头人
邮箱:2205455617@qq.com


导入库
import matplotlib.pyplot as plt
import numpy as np
import xarray as xr
import cartopy.crs as ccrs
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import cartopy.feature as cfeature
读取数据
path = "E:/tp/sst.mon.mean.nc"
f = xr.open_dataset(path)
# 继续读取其他变量
print(f.variables.keys())
lon2 = f["lon"]
lat = f["lat"]
t2 = f['sst']
# 修改经度0——360 → -180——180
# 若以180为中心即0——360,则不使用该替换,图中不会有白竖线
# 若以0为中心即-180——180,则使用该替换,图中不会有白竖线
f.coords['lon'] = f['lon'].where(f['lon'] <= 180, f['lon'] - 360)
f = f.reindex({ 'lon' : np.sort(f['lon'])})
lon1 = f["lon"]
t1 = f['sst']
画图
# 设置投影
proj = ccrs.PlateCarree()
proj1 = ccrs.PlateCarree(central_longitude = 180)
# 创建图形
# 只需在此修改投影中心纬度即可,其余地方均不使用
fig = plt.figure(figsize=(12, 8), dpi=600)
ax1 = plt.subplot(2, 1, 1, projection=proj)
ax2 = plt.subplot(2, 1, 2, projection=proj1)
# 设置边界
extent = [-180, 180, -40, 70]   #每张图的经纬度范围
ax1.set_extent(extent, crs = proj)
ax2.set_extent(extent, crs = proj)
# 绘制海岸线、湖泊
ax1.add_feature(cfeature.COASTLINE.with_scale('50m'))
ax1.add_feature(cfeature.LAKES, alpha=0.5)
ax2.add_feature(cfeature.COASTLINE.with_scale('50m'))
ax2.add_feature(cfeature.LAKES, alpha=0.5)
# 画温度场
cf1 = ax1.contourf(lon1, lat, t1, cmap='bwr', extend="both", levels=np.arange(0, 35, 5), transform = proj)
cb1 = fig.colorbar(cf1, pad = 0.02, fraction = 0.04, ax = ax1, label = 'SST')
cf2 = ax2.contourf(lon2, lat, t2, cmap='bwr', extend="both", levels=np.arange(0, 35, 5), transform = proj)
cb2 = fig.colorbar(cf2, pad = 0.02, fraction = 0.04, ax = ax2)

设置刻度及刻度标签格式和标题
# extent 可能是一个包含地图范围的列表或元组,通常表示为 。
# 在这里,我们通过 extent + 1 获取 x 轴刻度的起始位置,extent + 0.5 获取 x 轴刻度的结束位置,并且 2 表示刻度之间的间距。
ax1.set_xticks(np.arange(extent, extent+1, 60), crs=proj)
ax1.set_yticks(np.arange(extent+10, extent+1, 20), crs=proj)
ax1.xaxis.set_major_formatter(LongitudeFormatter())
ax1.yaxis.set_major_formatter(LatitudeFormatter())
ax1.set_title('SST (℃)   Central_longitude = 0', loc="left", fontsize=12, pad=1)
ax2.set_xticks(np.arange(extent, extent+1, 60))
ax2.set_yticks(np.arange(extent+10, extent+1, 20))
ax2.xaxis.set_major_formatter(LongitudeFormatter())
ax2.yaxis.set_major_formatter(LatitudeFormatter())
ax2.set_title('SST (℃)   Central_longitude = 180', loc="left", fontsize=12, pad=1)
# left:左边界的位置,取值范围为 0 到 1; right: 右边界的位置,取值范围为 0 到 1;
# top: 上边界的位置,取值范围为 0 到 1; bottom:下边界的位置,取值范围为 0 到 1;
# wspace:子图之间的水平间距,取值范围为 0 到 1; hspace:子图之间的垂直间距,取值范围为 0 到 1。
# bbox_inches='tight' 参数用于指定图像的边界框。设置为 'tight' 表示将图像边界框调整为最小,并且不留有空白边距。
plt.subplots_adjust(left = 0.25, right = 0.85, top = 0.85, bottom = 0.25, wspace = 0.35, hspace = 0.20)
plt.savefig('E:/SST.png', dpi=600, bbox_inches='tight')
# plt.show()


完整代码
## 导入库
import matplotlib.pyplot as plt
import numpy as np
import xarray as xr
import cartopy.crs as ccrs
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import cartopy.feature as cfeature

## 读取数据
path = "E:/tp/sst.mon.mean.nc"
f = xr.open_dataset(path)
# 继续读取其他变量
print(f.variables.keys())
lon2 = f["lon"]
lat = f["lat"]
t2 = f['sst']
# 修改经度0——360 → -180——180
# 若以180为中心即0——360,则不使用该替换,图中不会有白竖线
# 若以0为中心即-180——180,则使用该替换,图中不会有白竖线
f.coords['lon'] = f['lon'].where(f['lon'] <= 180, f['lon'] - 360)
f = f.reindex({ 'lon' : np.sort(f['lon'])})
lon1 = f["lon"]
t1 = f['sst']

## 画图
# 设置投影
proj = ccrs.PlateCarree()
proj1 = ccrs.PlateCarree(central_longitude = 180)
# 创建图形
# 只需在此修改投影中心纬度即可,其余地方均不使用
fig = plt.figure(figsize=(12, 8), dpi=600)
ax1 = plt.subplot(2, 1, 1, projection=proj)
ax2 = plt.subplot(2, 1, 2, projection=proj1)
# 设置边界
extent = [-180, 180, -40, 70]   #每张图的经纬度范围
ax1.set_extent(extent, crs = proj)
ax2.set_extent(extent, crs = proj)
# 绘制海岸线、湖泊
ax1.add_feature(cfeature.COASTLINE.with_scale('50m'))
ax1.add_feature(cfeature.LAKES, alpha=0.5)
ax2.add_feature(cfeature.COASTLINE.with_scale('50m'))
ax2.add_feature(cfeature.LAKES, alpha=0.5)
# 画温度场
cf1 = ax1.contourf(lon1, lat, t1, cmap='bwr', extend="both", levels=np.arange(0, 35, 5), transform = proj)
cb1 = fig.colorbar(cf1, pad = 0.02, fraction = 0.04, ax = ax1, label = 'SST')
cf2 = ax2.contourf(lon2, lat, t2, cmap='bwr', extend="both", levels=np.arange(0, 35, 5), transform = proj)
cb2 = fig.colorbar(cf2, pad = 0.02, fraction = 0.04, ax = ax2)

#设置刻度及刻度标签格式和标题
# extent 可能是一个包含地图范围的列表或元组,通常表示为 。
# 在这里,我们通过 extent + 1 获取 x 轴刻度的起始位置,extent + 0.5 获取 x 轴刻度的结束位置,并且 2 表示刻度之间的间距。
ax1.set_xticks(np.arange(extent, extent+1, 60), crs=proj)
ax1.set_yticks(np.arange(extent+10, extent+1, 20), crs=proj)
ax1.xaxis.set_major_formatter(LongitudeFormatter())
ax1.yaxis.set_major_formatter(LatitudeFormatter())
ax1.set_title('SST (℃)   Central_longitude = 0', loc="left", fontsize=12, pad=1)
ax2.set_xticks(np.arange(extent, extent+1, 60))
ax2.set_yticks(np.arange(extent+10, extent+1, 20))
ax2.xaxis.set_major_formatter(LongitudeFormatter())
ax2.yaxis.set_major_formatter(LatitudeFormatter())
ax2.set_title('SST (℃)   Central_longitude = 180', loc="left", fontsize=12, pad=1)
# left:左边界的位置,取值范围为 0 到 1; right: 右边界的位置,取值范围为 0 到 1;
# top: 上边界的位置,取值范围为 0 到 1; bottom:下边界的位置,取值范围为 0 到 1;
# wspace:子图之间的水平间距,取值范围为 0 到 1; hspace:子图之间的垂直间距,取值范围为 0 到 1。
# bbox_inches='tight' 参数用于指定图像的边界框。设置为 'tight' 表示将图像边界框调整为最小,并且不留有空白边距。
plt.subplots_adjust(left = 0.25, right = 0.85, top = 0.85, bottom = 0.25, wspace = 0.35, hspace = 0.20)
plt.savefig('E:/SST.png', dpi=600, bbox_inches='tight')
# plt.show()

微信搜索“第八星系人造大气理论爱好者”公众号,关注获取文章数据

页: [1]
查看完整版本: Python不同中心经纬度填色图