python给折线图区间填充颜⾊_Python⽓象数据处理与绘图
(3):以EOF为例画柱状。。。
更新完整版,修复了⼏个⼩问题,提供了测试数据下载
最新版见此
EOF(经验正交分解)是⽓候研究中常⽤的研究变量时空变化特征的分析⽅法,短期⽓候课中都学过中国东部夏季降⽔通过EOF分解可以分为三类⾬型,在NCL中,EOF有直接的函数可以调⽤,⽽在python中,也有对应的库可以直接使⽤。
完整的说明见:
通过
conda install -c conda-forge eofs
可以直接安装。
由于数据以及EOF所选范围原因,可能结果存在⼀些差异,但是问题不⼤233333
先上图吧:
图的分析就不献丑了。主要还是分享⼀下绘制⽅法。
⾸先是EOF的计算
print(summer_mean_tmp.shape)
#(55, 82, 142)
print(pre_lat.shape)
#(82,)
print(pre_lon.shape)
#(142,)
这是⽤来分解的数据,55年夏季降⽔,纬度和经度。接下来进⾏EOF分解:
from eofs.standard import Eof
lat = np.array(pre_lat)
转行数据分析师就是死coslat = np.cos(np.deg2rad(lat))
wgts = np.sqrt(coslat)[..., np.newaxis]
#计算纬度权重
solver = Eof(summer_mean_tmp, weights=wgts)
#创建EOF函数
eof = fsAsCorrelation(neofs=3)
#获取前三个模态
pc = solver.pcs(npcs=3, pcscaling=1)
var = solver.varianceFraction()
#获取对应的PC序列和解释⽅差
气象python零基础入门教程这样我们获得了:
print(eof.shape)
#(3, 82, 142)
print(pc.shape)
#(55, 3)
print(var.shape)
#(55, )
⾄于⽅差为啥是(55),我也不记得了,但是var[n]对应第n模态的⽅差,结果与NCL计算的结果基本⼀致。
换个方式做吧下拉菜单得到了以上的结果,就可以⽤于绘图了。
⾸先是模态的绘制,即带地图底图的填⾊图
我推荐使⽤matplotlib + cartopy实现
conda install -c conda-forge cartopy
conda install matplotlib
ps快速切片完成安装后
import matplotlib as plt
s as ccrs
import cartopy.feature as cfeature
from idliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
import cartopy.mpl.ticker as cticker
import cartopy.io.shapereader as shpreader
gridview显示不出来
这次引⼊的东西有点多,分别⽤于绘图,添加地图投影,添加地图特征(海岸线,湖泊等等),设置地理坐标(XX°E),设置正确的中国国境线(默认的国境线把⼀些冲突地区偷吃了)
fig2 = plt.figure(figsize=(15,15))
linux怎么安装gcc
proj = ccrs.PlateCarree(central_longitude=115)
#设置⼀个圆柱投影坐标,中⼼经度115°E
leftlon, rightlon, lowerlat, upperlat = (70,140,15,55)
#设置地图边界范围
f2_ax1 = fig2.add_axes([0.1, 0.8, 0.5, 0.3],projection = proj)
f2_ax1.set_extent([leftlon, rightlon, lowerlat, upperlat], crs=ccrs.PlateCarree())
f2_ax1.add_feature(cfeature.COASTLINE.with_scale('50m'))
f2_ax1.add_feature(cfeature.LAKES, alpha=0.5)
f2_ax1.set_xticks(np.arange(leftlon,rightlon+10,10), crs=ccrs.PlateCarree())
f2_ax1.set_yticks(np.arange(lowerlat,upperlat+10,10), crs=ccrs.PlateCarree())
lon_formatter = cticker.LongitudeFormatter()
lat_formatter = cticker.LatitudeFormatter()
f2_ax1.xaxis.set_major_formatter(lon_formatter)
f2_ax1.yaxis.set_major_formatter(lat_formatter)
f2_ax1.set_title('(a)',loc='left',fontsize =15)
f2_ax1.set_title( '%.2f%%' % (var[0]*100),loc='right',fontsize =15)
urf(pre_lon,pre_lat, eof[0,:,:], levels=np.arange(-0.9,1.0,0.1), zorder=0, extend =
'both',transform=ccrs.PlateCarree(), RdBu_r)
china = shpreader.Reader('bou2_4l.dbf').geometries()
f2_ax1.add_geometries(china, ccrs.PlateCarree(),facecolor='none', edgecolor='black',zorder = 1)
通过函数的字⾯意思应该可以理解⼤部分语句的意思,'bou2_4l.dbf'是中国国界线shp⽂件,⽓象家园有下载。通过类似的⽅法,缩⼩⼦图,覆盖在⼤图上便可实现南海的绘制。九段线同样有对应的shp⽂件。
EOF的另⼀部分便是PC序列的绘制,红正蓝负的实现通过如下循环换实现:
color1=[]
for i in range(1961,2016):
if pc[i-1961,0] >=0:
color1.append('red')
elif pc[i-1961,0] <0:
color1.append('blue')
或许有更简便的⽅法,⽬前我还没想到2333
f2_ax4 = fig2.add_axes([0.65, 0.8, 0.5, 0.3])
f2_ax4.set_title('(d)',loc='left')
f2_ax4.set_ylim(-2.5,2.5)
f2_ax4.axhline(0,line)
f2_ax4.bar(years,pc[:,0],color=color1)
#f2_ax4.plot(years,pc[:,0])
#只需将bar换为plot即为折线图

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。