python去除sst季节性空间分布图中,0°经线处出现的白线

简介: 近日,在处理sst月均数据时,绘制出季节性的空间分布图时,发现:绘出的图像在0°出现一条白线,经过查询将问题已经解决。

近日,在处理sst月均数据时,绘制出季节性的空间分布图时,发现:绘出的图像在0°出现一条白线,经过查询将问题已经解决。


图像问题如下:


20210718214103419.png

其中,需要使用到cartopy.util模块下的add_cyclic_point函数。

该函数**add_cyclic_point(data,coord)**包含两个关键参数。data表示需要参与循环的数据,我这里就是sst。coord表示需要参与循环的维度,因为是经度方向出了问题,所以这里选择的就是经度。

官方说明在这

大致使用思路如下:


from cartopy.util import add_cyclic_point
cycle_sst, cycle_lon = add_cyclic_point(sst, coord=lon)
cycle_LON, cycle_LAT = np.meshgrid(cycle_lon, lat)


首先当然是要导入这个模块啦,然后通过这个函数对你的循环数据(我这里是海表温度sst,是一个二维的数据[lat:73,lon:144])和出问题的维度进行处理。之后,将处理后的维度与旧的维度进行网格化处理。(我这里就是将循环生成的新经度和没有参与循环的旧纬度重新网格化得到新的cycle_lon,cycle_lat,最后再和循环生成的新sst绘制等值线填充图)


处理之后再次绘制等值填充图,可以发现白线已经消失啦~~,非常的amazing呀~!!

附上代码,处理前:


from cartopy.util import add_cyclic_point
import matplotlib.ticker as mticker
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import pandas as pd
from netCDF4 import num2date
import cmaps
import matplotlib.pyplot as plt
import numpy as np
import netCDF4 as nc
import cartopy.crs as ccrs
from scipy import interpolate
import os
import numpy as np
import xarray as xr
path1='F://olr.nc'
path2='F://sst.nc'
da = xr.open_dataset(path2)
orl=xr.open_dataset(path1)
da = xr.open_dataset(path2)
orl=xr.open_dataset(path1)
sst = da['sst']
sst= sst.interp(lat=orl.lat.values, lon=orl.lon.values,kwargs={  "fill_value": "extrapolate"})
lon=sst['lon'][:]
lat=sst['lat']
time=sst['time'][:]
time=time.loc['1982':'2012'][:]
sst_new=sst.loc['1982':'2012'][:]
lon_range = lon[(lon>=0) & (lon<360)]
lat_range = lat
sst_region =sst_new.sel(lon=lon_range, lat=lat_range)
season_summary = sst_region.groupby(
    'time.season').mean('time', skipna=True)
fig=plt.figure(figsize=(20,12))#设置一个画板,将其返还给fig
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 15
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=0))
ax.coastlines()
cm = plt.cm.get_cmap('bwr')#Spectral_r
cb = ax.contourf(lon, lat_range,season_summary[1],cmap=cm,levels=np.arange(20,36),\
        )
# cycle_sst, cycle_lon = add_cyclic_point(season_summary[1], coord=lon)
# cycle_LON, cycle_LAT = np.meshgrid(cycle_lon, lat_range)
# cb=ax.contourf(cycle_LON,cycle_LAT, cycle_sst,levels=np.arange(20,36),cmap='bwr',\
#     )
ax.set_extent([-180, 180, -20, 20], crs=ccrs.PlateCarree())
ax.set_xticks(np.arange(0, 361, 30),crs=ccrs.PlateCarree())
ax.set_yticks(np.arange(-20, 25, 5),crs=ccrs.PlateCarree())
ax.xaxis.set_major_formatter(LongitudeFormatter())#经度0度不加东西
ax.yaxis.set_major_formatter(LatitudeFormatter())
cm = plt.cm.get_cmap('bwr')#Spectral_r
ax.set_title('JJA')
cbar = plt.colorbar(cb,shrink=0.7)


处理后代码:


from cartopy.util import add_cyclic_point
import matplotlib.ticker as mticker
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import pandas as pd
from netCDF4 import num2date
import cmaps
import matplotlib.pyplot as plt
import numpy as np
import netCDF4 as nc
import cartopy.crs as ccrs
from scipy import interpolate
import os
import numpy as np
import xarray as xr
path1='F://olr.nc'
path2='F://sst.nc'
da = xr.open_dataset(path2)
orl=xr.open_dataset(path1)
da = xr.open_dataset(path2)
orl=xr.open_dataset(path1)
sst = da['sst']
sst= sst.interp(lat=orl.lat.values, lon=orl.lon.values,kwargs={  "fill_value": "extrapolate"})
lon=sst['lon'][:]
lat=sst['lat']
time=sst['time'][:]
time=time.loc['1982':'2012'][:]
sst_new=sst.loc['1982':'2012'][:]
lon_range = lon[(lon>=0) & (lon<360)]
lat_range = lat
sst_region =sst_new.sel(lon=lon_range, lat=lat_range)
season_summary = sst_region.groupby(
    'time.season').mean('time', skipna=True)
fig=plt.figure(figsize=(20,12))#设置一个画板,将其返还给fig
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 15
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=0))
ax.coastlines()
**cycle_sst, cycle_lon = add_cyclic_point(season_summary[1], coord=lon)
cycle_LON, cycle_LAT = np.meshgrid(cycle_lon, lat_range)
cb=ax.contourf(cycle_LON,cycle_LAT, cycle_sst,levels=np.arange(20,36),cmap='bwr',\
    )**
ax.set_extent([-180, 180, -20, 20], crs=ccrs.PlateCarree())
ax.set_xticks(np.arange(0, 361, 30),crs=ccrs.PlateCarree())
ax.set_yticks(np.arange(-20, 25, 5),crs=ccrs.PlateCarree())
ax.xaxis.set_major_formatter(LongitudeFormatter())#经度0度不加东西
ax.yaxis.set_major_formatter(LatitudeFormatter())
cm = plt.cm.get_cmap('bwr')#Spectral_r
ax.set_title('JJA')
cbar = plt.colorbar(cb,shrink=0.7)


处理后图片如下:


20210718215606215.png


            一个努力学习python的海洋小白
                    水平有限,欢迎指正!!!
                    欢迎评论、收藏。
相关文章
|
7天前
|
机器学习/深度学习 数据处理 Python
SciPy 教程 之 SciPy 空间数据 7
本教程介绍了SciPy的空间数据处理功能,涵盖如何使用`scipy.spatial`模块进行点的位置判断、最近点计算等操作。还详细解释了距离矩阵的概念及其在生物信息学中的应用,以及汉明距离的定义和计算方法。示例代码展示了如何计算两个点之间的汉明距离。
14 1
|
10天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
20 1
|
10天前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
20 0
|
1月前
|
存储 自然语言处理 Python
解密 Python 的作用域和名字空间
解密 Python 的作用域和名字空间
16 1
|
1月前
|
存储 索引 Python
深度解密函数的 local 名字空间(当 Python 中混进一只薛定谔的猫……)
深度解密函数的 local 名字空间(当 Python 中混进一只薛定谔的猫……)
41 0
|
3月前
|
存储 Python
Python 中的名称空间是什么?
【8月更文挑战第29天】
18 0
|
3月前
|
测试技术 数据安全/隐私保护 Python
探索Python中的装饰器:简化代码,增强功能深入理解操作系统:从用户空间到内核空间的旅程
【8月更文挑战第29天】本文将引导你深入理解Python装饰器的核心概念、应用场景及其对代码的优化作用。我们将从基础使用到高级应用逐步展开,通过实例展示如何利用装饰器提升代码的可读性和复用性,同时避免常见的陷阱。
|
3月前
|
PHP C++ Python
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
63 0
|
4月前
|
分布式计算 大数据 Java
如何使用Python的pyodps库来进行跨项目空间重命名表名?
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
50 12
|
4月前
|
Python
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题