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的海洋小白
                    水平有限,欢迎指正!!!
                    欢迎评论、收藏。
相关文章
|
2月前
|
Web App开发 JavaScript 前端开发
python实现QQ空间自动点赞功能
python实现QQ空间自动点赞功能
32 0
|
8月前
|
Linux 数据处理 iOS开发
Python空间数据处理环境搭建
常用的空间数据处理Python库 GDAL 全能型的基础空间数据处理库 fiona 基于GDAL的空间矢量数据处理库 rasterio 基于GDAL的空间栅格处理库 basemap 基于matplotlib的空间制图库 GeoPandas 基于pandas的空间数据分析库 RSGISlib 针对遥感数据及GIS分析的高级库
87 0
|
20天前
|
索引 Python
如何在Python中使用Pandas库进行季节性调整?
在Python中使用Pandas和Statsmodels进行季节性调整的步骤包括:导入pandas和seasonal_decompose模块,准备时间序列DataFrame,调用`seasonal_decompose()`函数分解数据为趋势、季节性和残差,可选地绘制图表分析,以及根据需求去除季节性影响(如将原始数据减去季节性成分)。这是对时间序列数据进行季节性分析的基础流程。
29 2
|
2月前
|
Java Python
|
5月前
|
存储 数据可视化 数据挖掘
Python下多变量联合分布图(pairplot)绘制——seaborn
Python下多变量联合分布图(pairplot)绘制——seaborn
|
6月前
|
缓存 Unix Linux
尝试安装或升级Python包时,由于设备上没有足够的空间而导致的错误
尝试安装或升级Python包时,由于设备上没有足够的空间而导致的错误
111 4
|
8月前
|
数据采集 数据处理 定位技术
Python空间数据处理实战
这是使用Python进行空间数据处理的系列教程。如果有热心网友对我的该系列博客《Python空间数据处理实战》有什么好的建议的话,比如需要增加哪些内容,写作风格上的改进等,可以直接给我留言或者发邮件,谢谢大家,希望我的分享能帮助到一些热衷GIS与RS数据处理的童鞋!如果有出版社希望,该系列的教程能够出版发行,欢迎联系作者!
152 0
|
9月前
|
数据可视化 Python
Python高考 | matplotlib绘制1977-2022年历届高考人数及录取率分布图
Python高考 | matplotlib绘制1977-2022年历届高考人数及录取率分布图
|
10月前
|
数据采集 缓存 监控
还你系统空间的 Python 小程序
Windows 系统用久了,磁盘中就会产生大量的“垃圾”文件。这些文件有的是程序使用过的临时文件,有的是操作记录和日志信息等。因为往往不能被有效地清理干净,越积越多,导致用户的可用空间越来越小。同时也会因为碎片文件过多,使得系统的运行速度受到一定影响。
|
测试技术 Python
软件测试|什么是Python函数及名称空间?
软件测试|什么是Python函数及名称空间?
68 0
软件测试|什么是Python函数及名称空间?