IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【python掩膜及多子图colorbar】 -> 正文阅读

[Python知识库]【python掩膜及多子图colorbar】

作者:recommend-item-box type_blog clearfix

Python气象处理绘图(三)–青藏高原空间分布白化



前言

前期进行了黄河流域降水分布的白化之后,最近尝试了对于青藏高原气象要素空间分布进行了白化。尝试绘制多子图,并学习了如何添加多子图的colorbar。


一、maskout子程序思路?

代码如下(参考微信公众号:气象水文科研猫发布的mask内容):
在进行特征量选取的时候,要选择有效的shape_rec,可以提前用arcmap等绘图软件检查shapeRecords的相关信息。本次使用的就是青藏高原的边界shp,因此不用选择特别的region,直接应用即可。

import shapefile
from matplotlib.path import Path
from matplotlib.patches import PathPatch
from shapely.geometry import Point as ShapelyPoint
from shapely.geometry import Polygon as ShapelyPolygon
from collections import Iterable
def shp2clip(originfig,ax,region_shpfile,clabel=None,vcplot=None):
    sf = shapefile.Reader(region_shpfile)
    for shape_rec in sf.shapeRecords():
    	#if shape_rec.record[0] == 1:#Hunan Sheng
        vertices = []
        codes = []
        pts = shape_rec.shape.points
        prt = list(shape_rec.shape.parts) + [len(pts)]
        for i in range(len(prt) - 1):
            for j in range(prt[i], prt[i+1]):
                vertices.append((pts[j][0], pts[j][1]))
            codes += [Path.MOVETO]
            codes += [Path.LINETO] * (prt[i+1] - prt[i] -2)
            codes += [Path.CLOSEPOLY]
        clip = Path(vertices, codes)
        clip = PathPatch(clip, transform=ax.transData)
    if vcplot:
        if isinstance(originfig,Iterable):
            for ivec in originfig:
                ivec.set_clip_path(clip)
        else:
            originfig.set_clip_path(clip)
    else:
        for contour in originfig.collections:
            contour.set_clip_path(clip)
    if  clabel:
        clip_map_shapely = ShapelyPolygon(vertices)
        for text_object in clabel:
            if not clip_map_shapely.contains(ShapelyPoint(text_object.get_position())):
                text_object.set_visible(False)    
    return clip

在这里插入图片描述
青藏高原边界shp利用arcmap打开如上所示
在这里插入图片描述
或者利用geopandas打开文件查询属性信息

import fiona
import geopandas
shp_path = 'E:/shapefile/青藏高原/青藏高原边界数据总集/TPBoundary_new(2021)/'
shp = geopandas.read_file(shp_path + 'TPBoundary_new(2021).shp')

在这里插入图片描述

二、绘制白化图形

1.引入库

代码如下(示例):

import cartopy.crs as ccrs
from matplotlib.path import Path
from matplotlib.patches import PathPatch
import matplotlib.pyplot as plt
from osgeo import gdal
import numpy as np
import cartopy.crs as ccrs
import shapefile
import os
from cartopy.io.shapereader import Reader
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import numpy
import pandas as pd
import xarray as xr
import matplotlib as mpl
from matplotlib.font_manager import FontProperties#自己设定字体的时候运用
import netCDF4 as nc
import cartopy.feature as cfeature
import cartopy.mpl.ticker as cticker
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER

2.读入数据并处理指标

代码如下(示例):

data=xr.open_dataset('E:/CORDEX-TP/hfls_1981-2005.nc')
cclm_hf=data.cclm_hf
wrf_hf=data.wrf_hf
had_hf=data.had_hf
remo_hf=data.remo_hf
cclm_hf_clim=np.nanmean(cclm_hf,axis=0)
wrf_hf_clim=np.nanmean(wrf_hf,axis=0)
had_hf_clim=np.nanmean(had_hf,axis=0)
remo_hf_clim=np.nanmean(remo_hf,axis=0)

该处使用的url网络请求的数据。


3.绘制图形

代码如下(示例):

leftlon=69
rightlon=105
lowerlat=24
upperlat=38
def contour_map(fig,img_extent,spec1,spec2,var,clevels):
    fig.set_extent(img_extent, crs=ccrs.PlateCarree())
    fig.set_xticks(np.arange(leftlon,rightlon+spec1,spec1), crs=ccrs.PlateCarree())
    fig.set_yticks(np.arange(lowerlat,upperlat+spec2,spec2), crs=ccrs.PlateCarree())
    lon_formatter = cticker.LongitudeFormatter()
    lat_formatter = cticker.LatitudeFormatter()
    fig.xaxis.set_major_formatter(lon_formatter)
    fig.yaxis.set_major_formatter(lat_formatter)
    fig.tick_params(labelsize=10)
    labels = fig.get_xticklabels() + fig.get_yticklabels()
    [label.set_fontname('Arial') for label in labels]
    ac=fig.contourf(lon,lat, var,clevels , cmap=cmap,norm = norm,
                        extend = 'both', transform=ccrs.PlateCarree() )
    fig.tick_params(labelsize=18)
    fig.add_geometries(Reader('E:/shapefile/青藏高原/青藏高原边界数据总集/TPBoundary_new(2021)/TPBoundary_new(2021).shp').geometries(),
                    crs=ccrs.PlateCarree(), facecolor='none',edgecolor='k',linewidth=1)
    return ac
    #%%绘图主程序
#公共设置
proj = ccrs.PlateCarree(central_longitude=85)
img_extent = [leftlon, rightlon, lowerlat, upperlat]
spec1=10
spec2=10
lon = np.arange(69.75, 140.5, 0.25)
lat = np.arange(14.75, 55.5, 0.25)
fig = plt.figure(figsize=[20,20],dpi=180)

# 采样简单的colormap线性映射关系https://www.cnblogs.com/cainiao-chuanqi/p/11301471.html
cdict = ['#191970','#6495ED','#024CEB','#87CEFA', '#E1FFFF', 
         '#FFFAFA', '#02BBA9', '#65FF00', '#FEFF00', '#FF8800', '#D40608','#BA55D3','#9400D3']
cmap = ListedColormap(cdict)
clevels1=[-150,-75,-25,-10,-5,0.0,5,10,25,50,75,150,200]#
norm = BoundaryNorm(clevels1, cmap.N)
#原文链接:https://blog.csdn.net/qq_35189715/article/details/109288053
#https://www.heywhale.com/mw/project/626965dcaf519200174517d7
#原文链接:https://blog.csdn.net/qq_35189715/article/details/109288053
#https://www.heywhale.com/mw/project/626965dcaf519200174517d7
#绘制子图
shp1='E:/shapefile/青藏高原/青藏高原边界数据总集/TPBoundary_new(2021)/TPBoundary_new(2021).shp'
#子图1
ax1=plt.subplot(5,4,1,projection=ccrs.PlateCarree())
ax1.set_title('(a) ERA5 DJF',loc='left',fontsize=12)#分别修改不同的季节并修改绘图区间
cf1=contour_map(ax1,img_extent,spec1,spec2,era5_hfls_DJF,clevels1)
ax1.set_xticks([])
ax1.set_yticks([])
clip1=shp2clip(ax1, ax1,shp1)
#...

#利用返回的ac值绘制共同的colorbar公用colorbar
核心点在contour_map中返回ac才能顺利地进行colorbar绘制

ac=contour_map(ax20,img_extent,spec1,spec2,era5_hfls_DJF,clevels1)
clip=shp2clip(ac, ax20,shp1)
l,b,w,h = 0.25, 0.08, 0.5, 0.02
rect = [l,b,w,h]#位置[,,,]
cbar_ax = fig.add_axes(rect)
cb = fig.colorbar(ac, cax = cbar_ax,orientation='horizontal')#spacing='proportional'
cb.set_label('Units:W/(m**2)',fontsize=18)
plt.suptitle(f'Surface latent heat flux',fontsize=32,x=0.5,y=0.92)
plt.savefig("hfls1.png", dpi=180)
    

总结

绘制的图形:在这里插入图片描述

  1. shp文件的读取,特征值选取,maskout的改写
  2. 由于cordex数据是旋转坐标,因此需要进行插值成非旋转坐标的值才能够进行常规坐标分析,在后文会对IDW插值的运用进行更新
  3. 多子图colorbar的设定核心:返回ac值。如果不返回ac的话,绘制的colorbar则无法适应子图。
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-09-25 23:11:09  更:2022-09-25 23:11:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 3:26:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计