基于cartopy绘制contour并对中国地区进行白化(包含南海)

1. 写在前面

利用cartopy画填色图已经掌握,这一篇主要记录了在填色的基础上叠加白化。主要参考了气象家园的两篇帖子,并进行了整理绘图。帖子1 http://bbs.06climate.com/forum.php?mod=viewthread&tid=100563&highlight=%B0%D7%BB%AF 主要总结了论坛里的几种白化方法,并提供了maskout.py文件,本人主要采用了第四种方法,测试数据也从那获取。 帖子2 http://bbs.06climate.com/forum.php?mod=viewthread&tid=100551&highlight=cartopy 主要获取了各种shp文件,感谢大神们!

2. 效果图


先看效果图,(a)©两图给出了完整的中国地图和完整的南海九段线,其中(a)添加了海岸线;(b)(d)两图中南海被放到了右下角,这也是常用的方法。

3. 导入库

主要用的库有读取netcdf的库,绘图的cartopy和matplotlib。最重要的是maskout.py这个库,可以从帖子1中第四种方法中获取。

import os
import maskout
from netCDF4 import Dataset
import numpy as np
import matplotlib as mpl
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
from cartopy.io.shapereader import Reader
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker

4. 读取数据

测试数据在帖子1中获取,shp文件在帖子2中获取,不再重复。感谢两位楼主大佬。

## 读数据
f = Dataset(r'2019-06-01-1-5.nc')
lat = f.variables['latitude'][:]
lon = f.variables['longitude'][:]
t = f.variables['t'][2,1,:,:]  # 气温
##########################################################
#白化中国地图,加南海九段线,加海岸线
SHP = r'C:\Users\qiuyu\.local\share\cartopy\shapefiles\natural_earth\cultural\china_shp'

5. 定义绘图函数

这一部分的思路就是,先绘制标准地图和标准的填色图,然后利用maskout.shp2clip进行白化,把中国地图以外的区域的填色给取消。可以选择添加或者不添加海岸线。

def make_map(ax,box,lon,lat,var,proj,title,if_coast, if_nanhai):projection = ccrs.PlateCarree()# 加国界ax.add_geometries(Reader(os.path.join(SHP, 'cnmap.shp')).geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k', linewidth=0.7)# 加海岸线if if_coast:ax.add_geometries(Reader(os.path.join(SHP, 'coastline.shp')).geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k', linewidth=0.7)#标注坐标轴ax.set_extent([box[0],box[1],box[2],box[3]])ax.set_xticks(np.linspace(box[0], box[1],5), crs=projection) ax.set_yticks(np.linspace(box[2], box[3],5), crs=projection)#zero_direction_label=True 有度的标识,False则去掉'''lon_formatter = LongitudeFormatter(zero_direction_label=True) lat_formatter = LatitudeFormatter()ax.xaxis.set_major_formatter(lon_formatter)ax.yaxis.set_major_formatter(lat_formatter)#添加网格线ax.gridlines(linestyle='--',alpha=0.4)   # plot cf = ax.contourf(lon,lat,var,cmap = mpl.cm.RdBu_r,transform=ccrs.PlateCarree())  plt.colorbar(cf,ax=ax, extend='both',orientation='vertical') maskout.shp2clip(cf,ax,shpfile=os.path.join(SHP, 'country1.shp'),region='China',proj= proj)ax.set_title(title)return ax

6. 绘图

定义经纬度区间,建立画布和轴,调用make_map函数进行画图。此时,画出的(b)(d)两图没有包含南海小地图。

box1=[70,140,0,50]   #经纬度范围
box2=[70,140,15,50]  #经纬度范围
proj=ccrs.PlateCarree()
fig = plt.figure(figsize=(15,7))ax1 = fig.add_subplot(221,projection = ccrs.PlateCarree())
ax2 = fig.add_subplot(222,projection = ccrs.PlateCarree())
ax3 = fig.add_subplot(223,projection = ccrs.PlateCarree())
ax4 = fig.add_subplot(224,projection = ccrs.PlateCarree())make_map(ax1,box1,lon,lat,t,proj,title='(a) With coastline',if_coast=True, if_nanhai=True)
make_map(ax2,box2,lon,lat,t,proj,title='(b) With coastline + Nanhai',if_coast=True, if_nanhai=False)
make_map(ax3,box1,lon,lat,t,proj,title='(c) Without coastline',if_coast=False, if_nanhai=False)
make_map(ax4,box2,lon,lat,t,proj,title='(d) Without coastline + Nanhai',if_coast=False, if_nanhai=True)

7. 添加南海小地图

添加南海小地图的思路就是(1)先用fig.add_axes生成新的ax_nanhai插入到figure中,插入的位置由pos确定;(2)然后再重复画大地图的方法,用ax_nanhai绘制,选定新的区域(box_nanhai)。

#----------添加南海小地图------------------
def add_nanhai (ax,pos,if_coast):#--------------右下角添加南海地图------------------------------------------box_nanhai=[103,125,2,25]ax_nanhai = fig.add_axes(pos,projection = ccrs.PlateCarree())# 加国界ax_nanhai.add_geometries(Reader(os.path.join(SHP, 'cnmap.shp')).geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k', linewidth=0.7)if if_coast:ax_nanhai.add_geometries(Reader(os.path.join(SHP, 'coastline.shp')).geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k', linewidth=0.7)ax_nanhai.set_extent([box_nanhai[0],box_nanhai[1],box_nanhai[2],box_nanhai[3]])pos1 = [0.757, 0.54, 0.1, 0.1]  #南海小地图在figure中的位置和大小
pos2 = [0.757, 0.124, 0.1, 0.1]
add_nanhai(ax2,pos1,if_coast=True)
add_nanhai(ax4,pos2,if_coast=False)plt.savefig('map.png')

8. 完整代码

import os
import maskout
from netCDF4 import Dataset
import numpy as np
import matplotlib as mpl
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
from cartopy.io.shapereader import Reader
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker##########################################################
## 读数据
f = Dataset(r'2019-06-01-1-5.nc')
lat = f.variables['latitude'][:]
lon = f.variables['longitude'][:]
t = f.variables['t'][2,1,:,:]  # 气温
##########################################################
#白化中国地图,加南海九段线,加海岸线
SHP = r'C:\Users\qiuyu\.local\share\cartopy\shapefiles\natural_earth\cultural\china_shp'def make_map(ax,box,lon,lat,var,proj,title,if_coast, if_nanhai):projection = ccrs.PlateCarree()# 加国界ax.add_geometries(Reader(os.path.join(SHP, 'cnmap.shp')).geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k', linewidth=0.7)# 加海岸线if if_coast:ax.add_geometries(Reader(os.path.join(SHP, 'coastline.shp')).geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k', linewidth=0.7)#标注坐标轴ax.set_extent([box[0],box[1],box[2],box[3]])ax.set_xticks(np.linspace(box[0], box[1],5), crs=projection) ax.set_yticks(np.linspace(box[2], box[3],5), crs=projection)#zero_direction_label=True 有度的标识,False则去掉'''lon_formatter = LongitudeFormatter(zero_direction_label=True) lat_formatter = LatitudeFormatter()ax.xaxis.set_major_formatter(lon_formatter)ax.yaxis.set_major_formatter(lat_formatter)#添加网格线ax.gridlines(linestyle='--',alpha=0.4)   # plot cf = ax.contourf(lon,lat,var,cmap = mpl.cm.RdBu_r,transform=ccrs.PlateCarree())  plt.colorbar(cf,ax=ax, extend='both',orientation='vertical') maskout.shp2clip(cf,ax,shpfile=os.path.join(SHP, 'country1.shp'),region='China',proj= proj)ax.set_title(title)return ax# make plot box1=[70,140,0,50]
box2=[70,140,15,50]
proj=ccrs.PlateCarree()
fig = plt.figure(figsize=(15,7))ax1 = fig.add_subplot(221,projection = ccrs.PlateCarree())
ax2 = fig.add_subplot(222,projection = ccrs.PlateCarree())
ax3 = fig.add_subplot(223,projection = ccrs.PlateCarree())
ax4 = fig.add_subplot(224,projection = ccrs.PlateCarree())make_map(ax1,box1,lon,lat,t,proj,title='(a) With coastline',if_coast=True, if_nanhai=True)
make_map(ax2,box2,lon,lat,t,proj,title='(b) With coastline + Nanhai',if_coast=True, if_nanhai=False)
make_map(ax3,box1,lon,lat,t,proj,title='(c) Without coastline',if_coast=False, if_nanhai=False)
make_map(ax4,box2,lon,lat,t,proj,title='(d) Without coastline + Nanhai',if_coast=False, if_nanhai=True)#----------添加南海小地图------------------
def add_nanhai (ax,pos,if_coast):#--------------右下角添加南海地图------------------------------------------box_nanhai=[103,125,2,25]ax_nanhai = fig.add_axes(pos,projection = ccrs.PlateCarree())# 加国界ax_nanhai.add_geometries(Reader(os.path.join(SHP, 'cnmap.shp')).geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k', linewidth=0.7)if if_coast:ax_nanhai.add_geometries(Reader(os.path.join(SHP, 'coastline.shp')).geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k', linewidth=0.7)ax_nanhai.set_extent([box_nanhai[0],box_nanhai[1],box_nanhai[2],box_nanhai[3]])pos1 = [0.757, 0.54, 0.1, 0.1]
pos2 = [0.757, 0.124, 0.1, 0.1]
add_nanhai(ax2,pos1,if_coast=True)
add_nanhai(ax4,pos2,if_coast=False)plt.savefig('map.png')

Python气象数据可视化学习笔记5——基于cartopy绘制contour并对中国地区进行白化(包含南海)相关推荐

  1. python气象数据可视化学习笔记6——利用python地图库cnmaps绘制地图填色图并白化

    文章目录 1. 效果图 2. cnmaps简介及安装 2.1 写在前面 2.2 cnmaps简介和安装 3. 导入库 4. 定义绘图函数 4.1 使用get_adm_maps返回地图边界 4.2 ax ...

  2. python气象数据可视化学习笔记7——利用cartopy+cnmaps和ERA5数据绘制填色图并对中国地区白化

    文章目录 1. 效果图 2. 绘制基于中国地区的填色图(大地图) 3. 添加南海小地图 4. 读取数据并传入绘图函数 5. 代码完整版 1. 效果图 前序博文cnmaps填色图介绍了cnmaps在线地 ...

  3. python气象数据可视化学习记录1——基于ERA5数据画风场和海平面气压填色叠加图

    python气象数据可视化学习记录1--基于ERA5数据画风场和海平面气压填色叠加图 1. 写在前面 2. 图片效果 3. 逐步代码解析 3.1导入库 3.2 读取NC格式数据 3.3 对数据进行加工 ...

  4. ECharts数据可视化学习笔记和应用

    ECharts数据可视化学习笔记和应用 一.概念 二.Echarts使用 使用步骤 三.Echarts-基础配置 四.柱状图图表1 五.柱状图图表2 六.折线图1 七.折线图2 八.饼状图1 九.饼形 ...

  5. R语言可视化学习笔记之ggridges包绘制山峦图

    作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源. 严涛老师的绘图教程还有: gganimate |诺奖文章里面的动图绘制教程来了!! ggplot2学习笔记之 ...

  6. python生物数据分析_Python学生物统计-数据可视化-学习笔记5

    5.1 作图的重要性 在分析一个数据之前, 我们首先要对数据进行检查, 在统计上看一下汇总统计, 比如最大值, 最小值, 中位数, 平均值, 方差, 标准差, 变异系数等等.直方图, 看一下数据的分布 ...

  7. Python数据可视化学习笔记:第一章 关联图 第四节 使用Python绘制一般气泡图

    前言 声明:这个系列的博文都是我自己学习所得的东西,秉承着每天进步一点点的理念进行学习,我参考的课程是<菊安酱与菜菜的Python机器学习可视化50图>,使用的Python版本为3.6.4 ...

  8. [转载] Python数据分析与可视化学习笔记(一)数据分析与可视化概述

    参考链接: Python | 数据分析的数学运算 数据分析与可视化(一) 1.1 数据分析1.1.1 数据.信息与数据分析1.1.2数据分析与数据挖掘的区别1.1.3数据分析的流程 1.2 数据可视化 ...

  9. Python数据分析与可视化学习笔记(一)数据分析与可视化概述

    数据分析与可视化(一) 1.1 数据分析 1.1.1 数据.信息与数据分析 1.1.2数据分析与数据挖掘的区别 1.1.3数据分析的流程 1.2 数据可视化 1.3 数据分析与可视化常用工具 1.4 ...

最新文章

  1. 计算机桌面为什么总是换,你的电脑桌面是什么,
  2. 混凝土墙开洞_易县混凝土剪力墙切割常见问题
  3. 交错排列(Alternating Permutation)问题详解
  4. 解码(三):AVFrame格式解析和空间处理函数
  5. GIS案例练习-----------第五天
  6. oracle短表和长表的区别,人口普查长表哪些人填和短表有什么区别
  7. python 图形可视化_Python数据可视化-图形,python,曲线图
  8. word打开doc文件提示运行时错误‘4605‘
  9. 将一个文字的大集合按照第一个文字的首字母进行切分
  10. antd upload取消图片删除按钮
  11. 蓝桥杯算法训练-24点(Python)
  12. (eblog)8、消息异步通知、细节调整
  13. 将yuv图像转为.jpg文件
  14. java用户登录界面并连接数据库(教师工资查询)
  15. MATLAB subplot、 stem
  16. 鲁照山思考致富六步学习方法
  17. 微信环境中APP推广如何实现跳转到浏览器(苹果商店)下载APK
  18. Xmanager的下载和使用
  19. 3d打印光固化好还是热固化好_创想三维再添重磅光固化3D打印机 LD-006大尺寸高精度-创想三维 LD-003_深圳3D打印机行情...
  20. 数据挖掘基础:度量数据的相似性和相异性

热门文章

  1. 【物联网/智慧城市】2021年物联网与智慧城市国际学术会议 (IoTSC2021)
  2. 双馈风机虚拟惯性控制参与系统一次调频的Matlab Simulink模型
  3. STM32-NUCLEO-F411RE-USART_串口
  4. Matlab出现错误使用save
  5. apicloud的ios和Android,APICloud开发者进阶之路|自己App加入系统分享
  6. 和网易大佬的技术面谈,大厂直通车!
  7. Airtest Project入门
  8. 什么是DNS劫持?如何应对DNS劫持?
  9. Python使用xlwings创建新的Excel工作簿文件
  10. ARCHICAD 21—三维建筑设计工具