Python(matplotlib)海洋温度垂直剖面图(附完整代码)

这里使用Argo格点数据BOA_Argo,如有需要可以从以下链接免费下载

【数据获取】

argo网格化数据获取:

ftp://data.argo.org.cn/pub/ARGO/BOA_Argo/

如遇到以上链接打不开的情况,且你不常用ftp传输没有下载相关软件的话,请直接复制代码到你本地电脑的资源管理器地址栏,就能看到数据了。(很多小伙伴问,特此说明)

说明文档如下

http://www.argo.org.cn/uploadfile/2021/0430/20210430042202188.pdf

【代码】

完整代码如下:

由于代码为大批量出图设计,所以设置了proGap值在函数中,控制每隔几个经纬度取一张图。

以下代码中取proGap=180,而经度是从0到360,因此只能画出两张图,可根据需求改为其他值,如改为10,就会得到每10个经度一张图,共36张。



import netCDF4 as nc
import matplotlib.pyplot as plt
import numpy as np
import os

#函数profilePlot
#输入:
# 读文件路径readFile,
# 要读的变量var=temp,
# 经度还是纬度截面proType = 'lon'or'lat'
# 间隔几度画一张图proGap
# 存文件路径savePath
#
#画profile图,存到存文件路径
#输出:0

#Path是到文件夹的路径,File是到文件的路径


def profilePlot(readFile = r"D:\Oceanic Sci\data_nc_argo_grid\BOA_Argo_2004_01.nc",
                var = 'temp', proType = 'lon', proGap = 180,
                savePath = "D:\\Oceanic Sci\\img_Temp\\img_Temp_global\\img_TempProfile\\"):
    '''var='temp' or 'salt'
    '''
    tfid = nc.Dataset(readFile)
    #print(tfid.variables)
    lon = tfid.variables['lon'][:]
    lat = tfid.variables['lat'][:]
    pre = tfid.variables['pres'][:]
    var = tfid.variables[var][0,:, :, :] #units = 'degree_Celsius'
    date = readFile[-10:-3]
    #因为这里的数据只有-79.5到79.5所以去掉空白的数据,让图更加美观
    start = np.where(np.array(lat)==-79.5)[0][0]
    end = np.where(np.array(lat)==79.5)[0][0]
    lat = lat[start:end]
    var = var[:,start:end,:]
    #画图经纬度取值,及x、y轴
    lonProfile = lon[::proGap]
    latProfile = lat[::proGap]
    y = pre
    if proType == 'lon':
        pros = lonProfile
        prosAll = lon #单纯为了得到切片位置的赋值
        x = lat        
    elif proType == 'lat':
        pros = latProfile
        prosAll = lat #单纯为了得到切片位置的赋值
        x = lon
    
    for i in pros:
        
        fontsize=10
        #画profile图 
        fig=plt.figure(figsize=(8,3),dpi=300,constrained_layout=True)#添加画布
        plt.rcParams['axes.facecolor']='lightgrey'#画布背景设为浅灰色
        ax=fig.add_axes([0,0,1,1])#添加子图
        ax.invert_yaxis()#反转纵轴,使最大值作为起点
        #ax.set_yticks([1000,925,850,700,500,300])#突出我们感兴趣的气压层
        #取温度,需要填色的二维值
        rank = np.where(np.array(prosAll)==i)[0][0]
        if proType == 'lon': 
            var0 = var[:,:,rank]
            ax.set_xticks(np.arange(-60,90,30))
            ax.set_xticklabels([r'60$^\degree$S',r'30$^\degree$S',
                                r'0$^\degree$',r'30$^\degree$N',r'60$^\degree$N']
                               ,fontsize=fontsize)
            xlabel = 'latitude'
        elif proType == 'lat': 
            print('rank:',rank)
            var0 = var[:,rank,:]
            ax.set_xticks(np.arange(0,360,30))
            ax.set_xticklabels([r'180$^\degree$', r'150$^\degree$W',r'120$^\degree$W',
                                r'90$^\degree$W',r'60$^\degree$W',r'30$^\degree$W',
                                r'0$^\degree$',r'30$^\degree$E',r'60$^\degree$E',
                                r'90$^\degree$E',r'120$^\degree$E',r'150$^\degree$E']
                               ,fontsize=fontsize)#转换为纬度格式
            xlabel = 'longitude'
        #ax.set(ylim=(1200,0))#设置气压层绘图范围
        ax.set_xlabel(xlabel, fontsize=fontsize)
        ax.set_ylabel('pressure level(dbar)',fontsize=fontsize)
        ax.tick_params(axis='both',which='both',labelsize=fontsize)
        #画填色图
        apartNum = 12
        #levels = np.arange(0, 30, 2)
        ac=ax.contourf(x,y,var0,apartNum,cmap='jet',extend='both',alpha=0.75)
        #画出n条线,并将颜色设置为黑色
        
        contour = plt.contour(x,y,var0,apartNum,colors='k',linewidths=0.5)
        #等高线上标明温度的值,颜色是黑色
        plt.clabel(contour,fmt = '%.0f',fontsize=fontsize,colors='k')   
        cb=fig.colorbar(ac,extend='both',shrink=1,label='Temperature'
                        , pad=0.01)
       
        cb.ax.tick_params(axis='both',which='both',length=1,labelsize=fontsize)
        title = date+' '+proType+' = '+str(i)
        ax.set_title(title, fontsize=fontsize+3)
        plt.savefig(savePath+title+'.jpg',bbox_inches = 'tight')
        ##plt.savefig(savePath+title+'.jpg',constrained_layout=True)
        print(date+ proType+' = '+str(i)+'is plotted.')
    return 0



if __name__ == '__main__':

    profilePlot(readFile = '',   #这里需要是nc文件才行
                var = 'temp', proType = 'lon', proGap = 180,
                savePath = '')
            
  

出图如下:

Python(matplotlib)海洋温度垂直剖面图(附完整代码)_第1张图片

Python(matplotlib)海洋温度垂直剖面图(附完整代码)_第2张图片 如有疑问欢迎留言

你可能感兴趣的:(python,开发语言)