连长说过,日子就是问题叠着问题,要挺胸抬头去面对。 ——《士兵突击》

文章目录

  • 前言
    • 1. 概述
    • 2. 版本
      • 2.1 2021年6月1日 Version1
    • 3. 参考资料
  • 一、绘图数据
  • 二、制图程序
  • 三、制图结果

前言

1. 概述

  • 此系列博文记录Python的Cartopy库的学习笔记
  • 此博文在Cartopy制图学习01基础上,做了如下工作:
    • 自己设置配色
    • 自己设置图例

2. 版本

2.1 2021年6月1日 Version1

3. 参考资料

[1] Python气象绘图教程(十五)


一、绘图数据

  • 2010年5月份的3个月尺度的SPEI
  • 中国边界
  • 中国省界
  • 九段线

二、制图程序

# -*- coding: utf-8 -*-
"""
1. 程序目的(1) 绘制2020年5月份SPEI03空间分布图2. 山东青岛 2021年06月1日3. 数据4. 参考资料'https://scitools.org.uk/cartopy/docs/v0.13/matplotlib/advanced_plotting.html'"""# 0. 相关包的导入
import numpy as npimport matplotlib.colors as mcolors
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import matplotlib.patches as mpatchesimport cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.io.shapereader import Readerfrom matplotlib import rcParamsfrom osgeo import gdal# 设置matplotlib的字体
config = {"font.family":'SimHei', "font.size": 16, "mathtext.fontset":'stix'}
rcParams.update(config)
rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
rcParams['axes.unicode_minus'] = False  # 用来正常显示负号# 自主设置颜色
colorlevel=[-5,-2.0,-1.5,-1.0,-0.5,0,0.5,1.0,1.5,2.0,5]#等级
#颜色列表
colorlist=['xkcd:dark red','xkcd:red','xkcd:peach','xkcd:yellow','xkcd:pale green',\'xkcd:pale green','xkcd:pale green','xkcd:pale green','xkcd:pale green','xkcd:pale green']
new_map=mcolors.ListedColormap(colorlist)#产生颜色映射# 1. 路径处理和基本变量定义rootdir = r'C:\Users\Desktop\ChinaSPEI03\\'
shpname = rootdir + 'china\\china_country'
shpname2 = rootdir + 'china\\china_nine_dotted_line'
chinaprovince = rootdir + 'china\\china'# 2. tif数据读取tif_file = rootdir + 'China_201005SPEI03_Mask.tif'in_ds = gdal.Open(tif_file)# proj_wkt = in_ds.GetProjection()
# print(proj_wkt)# proj = osr.SpatialReference()
# proj.ImportFromWkt(proj_wkt)
# print(proj)# 获取tif数据的基本信息,用于制图设置
geo_transform = in_ds.GetGeoTransform()
#print(geo_transform)origin_x = geo_transform[0]
origin_y = geo_transform[3]
pixel_width = geo_transform[1]
pixel_height = geo_transform[5]# 行数和列数
n_rows = in_ds.RasterYSize
n_cols = in_ds.RasterXSize#print(n_rows,n_cols)in_band = in_ds.GetRasterBand(1) #打开波段1
in_data = in_band.ReadAsArray()# 数据范围
lon_range_new = np.linspace(origin_x,(origin_x+pixel_width*n_cols-pixel_width),n_cols)
lat_range_new = np.linspace(origin_y,(origin_y + pixel_height*n_rows-pixel_height),n_rows)# 数组无效值掩膜
mask = (in_data < -999)
in_data_mask = np.ma.array(in_data,mask=mask)# 3. 绘图
fig = plt.figure(figsize=(6,4),dpi=600)  #创建figure对象# 创建画图空间, 使用兰伯特投影# 投影设置
proj = ccrs.LambertConformal(central_longitude=107.5, \central_latitude=36.0, standard_parallels=(25,47))
ax = fig.subplots(1, 1, subplot_kw = {'projection': proj})  #主图# 图名
ax.set_title('2005年5月干旱情况',fontsize = 12,loc='center')# 设置颜色显示范围
norm = mcolors.Normalize(vmin=-2.5,vmax=2.5)# 设置网格点属性,以下用于兰伯特投影
region = [80, 130, 15.5, 52.5]
ax.set_extent(region)
lb = ax.gridlines(draw_labels=None,x_inline=False, y_inline=False,\linewidth=0.1, color='gray', alpha=0.8, linestyle='--' )
lb.xlocator = mticker.FixedLocator(range(0,180,10))
lb.ylocator = mticker.FixedLocator(range(0,90,10))
lb = ax.gridlines(draw_labels=True,x_inline=False, y_inline=False, \linewidth=0.1, color='gray', alpha=0.9, linestyle='--' )
lb.top_labels = False
lb.right_labels = None
lb.xlocator = mticker.FixedLocator(range(90, 129, 10))
lb.ylocator = mticker.FixedLocator(range(20, 50, 10))
lb.ylabel_style = {'size': 10, 'color': 'k'}
lb.xlabel_style = {'size': 10, 'color': 'k' }
lb.rotate_labels = False# 画pcolormesh图
cs = ax.pcolormesh(lon_range_new, lat_range_new, in_data_mask,\cmap = new_map, norm=norm,transform = ccrs.PlateCarree())   # 添加海岸线
ax.add_feature(cfeature.COASTLINE.with_scale('50m'),linewidth = 0.5)  # 绘制中国省界
ax.add_geometries(Reader(chinaprovince + '.shp').geometries(), ccrs.PlateCarree(), \facecolor = 'none', edgecolor = 'gray', linewidth = 0.8)   # 绘制中国边界
ax.add_geometries(Reader(shpname + '.shp').geometries(), ccrs.PlateCarree(), \facecolor = 'none', edgecolor = 'k', linewidth = 1)     # 绘制九段线
ax.add_geometries(Reader(shpname2 + '.shp').geometries(), ccrs.PlateCarree(), \facecolor = 'none', edgecolor = 'r', linewidth = 1)# 添加文字
fontdict = {'size':10,'color':'k','family':'Times New Roman'}
ax.text(67,47.5,'2010-05-SPEI03',
transform=ccrs.PlateCarree(),
fontdict=fontdict,
weight='normal')# 单独设置图例
larger1 = mpatches.Rectangle((0, 0), 1, 1, facecolor="#c7fdb5")
larger2 = mpatches.Rectangle((0, 0), 1, 1, facecolor="#ffff14")
larger3 = mpatches.Rectangle((0, 0), 1, 1, facecolor="#ffb07c")
larger4 = mpatches.Rectangle((0, 0), 1, 1, facecolor="#e50000")
larger5 = mpatches.Rectangle((0, 0), 1, 1, facecolor="#840000")
labels = ['无旱','轻旱','中旱','重旱','特旱']
ax.legend([larger1,larger2,larger3,larger4,larger5], labels,fontsize=9,frameon=True,loc='lower left', bbox_to_anchor=(-0.01, -0.01), fancybox=False)#############添加南海,实际上就是新建一个子图覆盖在之前子图的右下角##########
# 设置兰伯特投影
proj2 = ccrs.LambertConformal(central_longitude=115, \central_latitude=12.5, standard_parallels=(3,20))# 定位南海子图的位置,四个数字需要调整
# 四个数字分别是(left, bottom, width, height):
# 子图左下角水平方向相对位置,左下角垂直方向相对位置,子图宽,子图高
ax2 = fig.add_axes([0.73, 0.11, 0.1, 0.25], projection = proj2)ax2.set_extent([105, 125, 0, 26]) # 设置网格点
lb=ax2.gridlines(draw_labels=None,x_inline=False, y_inline=False,\linewidth=0.1, color='gray', alpha=0.8, linestyle='--' )
lb.xlocator = mticker.FixedLocator(range(90, 135, 5))
lb.ylocator = mticker.FixedLocator(range(0, 90, 5))# 添加海岸线
ax2.add_feature(cfeature.COASTLINE.with_scale('50m'),linewidth = 0.5)#绘制中国省界
ax2.add_geometries(Reader(chinaprovince + '.shp').geometries(), ccrs.PlateCarree(), \facecolor = 'none', edgecolor = 'gray', linewidth = 0.8)   # 添加中国边界
china = Reader(shpname + '.dbf').geometries()
ax2.add_geometries(china, ccrs.PlateCarree(), facecolor = 'none', \edgecolor = 'black', zorder = 1)# 添加数据
cs2 = ax2.pcolormesh(lon_range_new, lat_range_new, in_data_mask,\cmap = new_map, norm=norm,transform = ccrs.PlateCarree())# 九段线
ax2.add_geometries(Reader(shpname2 + '.shp').geometries(), ccrs.PlateCarree(), \facecolor = 'none', edgecolor = 'r', linewidth = 1)# 存储制图结果
plt.savefig(rootdir+'ChinaDrought.jpg',bbox_inches='tight',dpi=300)    print('Finished.')

三、制图结果

Python-Cartopy制图学习02-中国2010年5月干旱情况空间制图相关推荐

  1. Python Flask教程学习02

    书接上文Python Flask教程学习01 文章目录 Flask 教程 Flask 会话 Flask 消息闪现 Flask 文件上传 Flask 扩展/寻找扩展 Flask 教程 Flask 会话 ...

  2. python 基础语法学习笔记(2019年4月第二周学习笔记)

    python day01 2019.4.8 计算机基础,python 变量 1.随机存储器就是内存:断电数据丢失,读写速度快 2.外存储器,硬盘,断电数据依然保存,缺点,读写速度慢 3.操作系统是什么 ...

  3. Python Flask教程学习03

    书接上文Python Flask教程学习02 文章目录 Flask 教程 Flask 邮件(Flask-Mail) Flask Mysql及Flask SQLAlchemy 创建数据表 插入数据 查询 ...

  4. Python 学习 02 —— Python如何爬取数据

    文章目录 系列文章 二.Python 爬 虫 1.任务介绍 2.简介 3.基本流程 3.1.准备工作 3.1.1.分析页面 3.1.2.编码规范 3.1.3.导入模块 3.1.4.程序流程 3.2.获 ...

  5. python采用Basemap绘制完美中国地图(包括绘制边界框,随机点等)

    python采用Basemap绘制完美中国地图(包括绘制边界框,随机点等) 1. 效果图 2. 原理 2.1 依赖模块及安装 2.2 工程目录 2.3 依赖文件latlng.txt 经纬度 3 源码 ...

  6. 【python教程入门学习】几款Python编译器比较与推荐(小结)

    这篇文章主要介绍了几款Python编译器比较与推荐(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 我先给一个初步的表格 ...

  7. Python基础的学习和简单爬虫的编写

    一.Python基础的学习 观看B站up GenJi是真的想教会你 的视频结合RUNOOB.COM进行学习 二.简单爬虫的编写 爬虫实现的功能: 爬取豆瓣电影top250的电影名称.电影信息.评分.评 ...

  8. 如何用 OpenCV、Python 和深度学习实现面部识别?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|新机器视觉 Face ID 的兴起带动了一波面部识别技术热 ...

  9. python入门经典代码-python经典入门学习锦集就这篇够了,强烈建议收藏!

    原标题:python经典入门学习锦集就这篇够了,强烈建议收藏! Python 简介 Python 是一种高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python 由 Guido van ...

  10. html标签 补全方法 python,Python Beautiful Soup学习之HTML标签补全功能

    Beautiful Soup是一个非常流行的Python模块.该模块可以解析网页,并提供定位内容的便捷接口. 使用下面两个命令安装: pip install beautifulsoup4或者 sudo ...

最新文章

  1. 不仅要“打假”,Facebook 还要治理视频直播中的裸露、暴力内容
  2. 阿里平头哥发布AIoT芯片平台“无剑”,可将芯片设计成本降低50%
  3. 使用Qt作窗口截屏(含源码)
  4. 算法 -克鲁斯卡尔算法
  5. 专访Google数据科学家彭晨:大数据成为潮流走近各行各业!
  6. 百家搜索:在网站中添加Google、百度等搜索引擎
  7. 如何让你的手机比别人最先升级到 Android L
  8. discuz x2.5 广告位开发学习(第一步:摸索)
  9. Python中的split()函数的使用方法
  10. MIT操作系统实验-XV6项目环境搭建
  11. 三菱PLC编程口通信上位机端报文和java示范代码
  12. 服务器与客户端的简单实现
  13. 前嗅ForeSpider数据采集教程:采集东方财富网链接列表
  14. 减法公式运算法则_数学加减法运算和运算法则
  15. 自动切换输入法 mac版能让你在不同的应用之间自动的切换输入法
  16. 北大计算机图灵班,北大首期“图灵班”开班
  17. spring实战学习(一)简介
  18. 点灯 arduino玛克君
  19. I2C3挂载wm8960音频芯片竟如此简单
  20. iOS关于音频文件格式的转换

热门文章

  1. Madis模拟黏滞阻尼器
  2. Ubuntu下Maven安装和使用
  3. 智能机器人及其应用ppt课件_3D机器视觉在智能机器人拆垛中的应用
  4. JUnit5总体介绍
  5. 我要注册一个邮箱,如何注册邮箱正确格式?
  6. jQuery-点击按钮插入视频
  7. libmodbus在ARM linux开发板上使用
  8. 双足机器人Maltab腿部建模,正运动学分析
  9. Visual Studio 2022安装配置
  10. DP 动态规划(一) ——背包问题 学习总结(闫氏DP分析法)