python气象处理第三弹-绘制气象站点分布


python气象处理第三弹-绘制气象站点分布

  • python气象处理第三弹-绘制气象站点分布
  • 前言
  • 一、下载并转换中国气象站点数据?
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
    • 3.frykit说明
  • 总结

前言

在书写科研论文的研究区域的部分时,常常需要对研究区域的地形、气象观测站点等信息的进行图片形式的展现。因此参考Python可视化中国区域地面气象要素驱动数据集—以黄河流域为例绘制出了中国气象站点和黄河流域分布图。


一、下载并转换中国气象站点数据?

下载链接中国气象要素逐日站点观测数据集

查询发现下载的为shp信息

因此用arcmap打开文件查询站点信息如下

利用上图转换工具将.dbf转换成excel .xls数据方便利用python读取站点数据并绘图

二、使用步骤

1.引入库

代码如下(示例):

import warnings
warnings.filterwarnings("ignore")
import matplotlib as mpl
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeat
import cartopy.mpl.ticker as cticker
import matplotlib.ticker as mticker
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
import pandas as pd
import numpy as np
from matplotlib.path import Path
from matplotlib.patches import PathPatch
import shapefile
import xarray as xr
import netCDF4 as nc
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from matplotlib.colors import BoundaryNorm, ListedColormap,LinearSegmentedColormap
from cartopy.io.shapereader import Reader
import pandas as pd

2.读入数据

代码如下(示例):

#读取全球地形数据
import xarray as xr# 导入xarray库
ds = xr.open_dataset('E:/CORDEX-TP/DATA/ETOPO2v2c_f4.nc')# 读取全球地形数据
x=ds.x
y=ds.y
z=ds.z
leftlat=np.where(y == 14.75)
rightlat=np.where(y == 55.25)
leftlon=np.where(x == 64.75)
rightlon=np.where(x == 140.25)
#读取中国站点数据
data = pd.read_csv("china_station.csv")
data.head
#绘制站点分布图[站点分布](https://zhuanlan.zhihu.com/p/411537086)
from matplotlib import rcParams
import cmaps
config = {"font.family":'Times New Roman',"font.size":12,"mathtext.fontset":'stix'}
rcParams.update(config)
region=[70,140,15,55]
fig=plt.figure(dpi=600,figsize=(12,6))
proj=ccrs.PlateCarree()
ax = plt.axes(projection = proj)
ax.set_extent(region, crs = proj)
ax.set_xticks(np.arange(region[0], region[1] + 1, 5), crs = proj)
ax.set_yticks(np.arange(region[-2], region[-1] + 1, 2), crs = proj)
ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label=False))
ax.yaxis.set_major_formatter(LatitudeFormatter())
# Add 中国十段线shp
ax.add_geometries(Reader(r'E:/shapefile/china_shp/china10.shp').geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k',linewidth=0.2)
c11=ax.contourf(lon,lat,dem,np.arange(0,8000,500),extend='both',transform=ccrs.PlateCarree(),cmap=cmaps.MPL_terrain)
#clip=shp2clip(c11,ax,'E:/shapefile/china_shp/china10')
cbar=plt.colorbar(c11,shrink=0.75,aspect=20,fraction=.03,pad=0.02)   #aspect控制bar宽度,fraction控制大小比例,pad控制与图的距离
cbar.set_ticks(np.arange(0,8000,500))            #设置colorbar范围和刻度标记间隔
cbar.ax.tick_params(labelsize=12, direction='in', right=False)
font3={'family':'SimHei','size':4,'color':'k'}
plt.scatter(data1['Lon'].values,data1['Lat'].values,marker='o',s=6,color ="k")
for i, j, k in list(zip(data1['Lon'].values, data1['Lat'].values, data1['name'].values)):plt.text(i-0.2,j-0.3,k,fontdict=font3)
ax.set_title('1979—2018年中国区域地面气象要素(气温)驱动数据集. 单位:K',{'family':'simhei','size':14,'color':'k'})
ax0 = plt.gca()   #获取边框
ax0.outline_patch.set_linewidth(0.5)    #修改边框粗细
#出图
plt.savefig('plot3.png',dpi=600)
plt.show()
#绘制青藏高原气象站点图
import frykit.plot as fplt
from matplotlib import rcParams
import cmaps
config = {"font.family":'Times New Roman',"font.size":12,"mathtext.fontset":'stix'}
rcParams.update(config)
region=[65, 114,20, 50]
fig=plt.figure(dpi=600,figsize=(12,6))
proj=ccrs.PlateCarree()
ax = plt.axes(projection = proj)
ax.set_extent(region, crs = proj)
ax.set_xticks(np.arange(region[0], region[1] + 1, 5), crs = proj)
ax.set_yticks(np.arange(region[-2], region[-1] + 1, 2), crs = proj)
ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label=False))
ax.yaxis.set_major_formatter(LatitudeFormatter())
# Add 中国十段线shp
shp_path = 'E:/shapefile/青藏高原/青藏高原边界数据总集/TPBoundary_new(2021)/'
shpfile=shp_path+'TPBoundary_new(2021).shp'
ax.add_feature(cfeat.RIVERS,  color = 'grey',zorder=1,edgecolor='black')
ax.add_geometries(Reader(r'E:/shapefile/青藏高原/青藏高原边界数据总集/TPBoundary_new(2021)/TPBoundary_new(2021).shp').geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k',linewidth=0.2)
ax.add_geometries(Reader(r'E:/shapefile/青藏高原/青藏高原省级行政边界(2015)/青藏高原省级行政边界.shp').geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k',linewidth=0.2)
#ax.add_geometries(Reader(r'E:/shapefile/hhriver/jichu/黄河干流epsg4324.shp').geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k',linewidth=0.5)
c11=ax.contourf(lon2,lat2,dem2,np.arange(0,8000,500),extend='both',transform=ccrs.PlateCarree(),cmap=cmaps.MPL_terrain)
# 添加指北针和比例尺.
fplt.add_north_arrow(ax, (0.1, 0.85))
fplt.add_map_scale(ax, (0.5, 0.1), length=1000, ticks=[0, 250,500, 1000])
font3={'family':'SimHei','size':4,'color':'k'}
plt.scatter(data['Lon.'].values,data['Lat.'].values,marker='o',s=6,color ="k")
position1=fig.add_axes([0.2, 0.01, 0.6, 0.018])#位置[左,下,右,上]  0.25, 0.35, 0.5, 0.014
cb=plt.colorbar(c11,cax=position1,orientation='horizontal')#方向
position1.set_title('Topography(m)',loc = 'center',fontsize=10,weight = 'normal')
cb.set_ticks(np.arange(0,8000,500))            #设置colorbar范围和刻度标记间隔
position1.set_title('Topography(m)',loc = 'center',fontsize=10,weight = 'normal')
cbar.ax.tick_params(labelsize=12, direction='in', right=False)
#clip=shp2clip(c11,ax,shpfile)
'''for i, j, k in list(zip(data['Lon.'].values, data['Lat.'].values, data['Name'].values)):plt.text(i-0.2,j-0.3,k,fontdict=font3)
#ax.set_title('青藏高原站点分布.单位:m',{'family':'simhei','size':14,'color':'k'})
ax0 = plt.gca()   #获取边框
ax0.outline_patch.set_linewidth(0.5)    #修改边框粗细'''
#出图
plt.savefig('tpstation.png',dpi=600)
plt.show()


Cartopy 绘制填色地图-添加指北针

3.frykit说明

pip install frykit

其中引入了一个frykit包,这是参考了气象备忘录公众号关于cartopy系列文章的说明frykit说明

  • 为兰伯特投影的 GeoAxes 添加刻度
import frykit.plot as fplotcrs = ccrs.LambertConformal(central_longitude=105, standard_parallels=(25, 47))
ax = fig.add_subplot(111, projection=crs)fplt.set_extent_and_ticks(ax, extents=[74, 136, 14, 56],xticks=np.arange(50, 161, 10),yticks=np.arange(0, 71, 10),grid=True, lw=0.5, ls='--', color='gray'
)
  • 获取代表中国行政区划的多边形对象
import frykit.shp as fshpcountry = fshp.get_cnshp(level='国')
provinces = fshp.get_cnshp(level='省')

行政区划的 shapefile 文件来自 ChinaAdminDivisonSHP 项目,坐标已从 GCJ-02 坐标系处理到了 WGS84 坐标系上。

  • 在 Axes 或 GeoAxes 上直接绘制中国省界和十段线
fplt.add_cn_province(ax, lw=0.3)
fplt.add_nine_line(ax, lw=0.5)
  • 添加自备的多边形对象并填色
pc = fplt.add_polygons(ax, polygons, ccrs.PlateCarree(), array=data,cmap=cmap, norm=norm, ec='k', lw=0.4
)
cbar = fig.colorbar(pc, ax=ax)
  • 用国界裁剪等值线填色图
cf = ax.contourf(lon, lat, data, levels, cmap='turbo',extend='both', transform=ccrs.PlateCarree()
)
fplt.clip_by_cn_border(cf, fix=True)
  • 添加指北针和比例尺
fplt.add_north_arrow(ax, (0.95, 0.9))
fplt.add_map_scale(ax, (0.1, 0.1), length=1000, ticks=[0, 500, 1000])
  • 定位南海地图
sub = fig.add_axes(ax.get_position(), projection=crs_map)
<plotting on sub>
fplt.locate_sub_axes(ax, sub, shrink=0.4)

总结

绘制站点分布主要分为三大步骤:

  • 用contourf绘制地形填充
  • 用scatter绘制站点信息
  • 用maskout掩膜感兴趣的区域

python气象处理第三弹-绘制气象站点分布相关推荐

  1. python+气象 | 在地图背景下绘制全国站点气温分布图

    0.写在前面 本来想画含等温线+填色+标注站点降温的图的,但是因为要来的数据是文本文件,绘制等温图不是小白能干的过于麻烦,于是最后只画了地图+站点. 结果如图(save之后的png格式图片,pytho ...

  2. python+OpenCV图像处理(三)绘制简单的几何图形、显示文字

    绘制简单的几何图形.显示文字 (一)绘制直线和矩形 img = np.zeros([512, 512, 3]) # line函数用来画直线,第一个参数可以理解为画布矩阵, # 第二个参数pt1是直线的 ...

  3. Python数据可视化(三)绘制统计图形大全

    3.1 柱状图 以 Python 代码的形式讲解柱状图的绘制原理,这里重点讲解 bar()函数的使用方法. 代码: import matplotlib as mpl import matplotlib ...

  4. 爬虫python爬取页面请求_03 Python网络爬虫第三弹《爬取get请求的页面数据》,urllib...

    一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...

  5. python可视化分析(三)-绘制带趋势线的散点图

    实现功能: 在散点图上添加趋势线(线性拟合线)反映两个变量是正相关.负相关或者无相关关系. 实现代码: import pandas as pd import matplotlib as mpl imp ...

  6. Python绘制气象风场

    title: Python绘制气象风场 date: 2021-08-05 21:01:52 tag: 气象风场数据来源为欧洲中心再分析数据ERA5 hourly data on pressure le ...

  7. Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用

    Python是功能强大.免费.开源,实现面向对象的编程语言,在数据处理.科学计算.数学建模.数据挖掘和数据可视化方面具备优异的性能,这些优势使得Python在气象.海洋.地理.气候.水文和生态等地学领 ...

  8. Python机器学习、深度学习技术提升气象、海洋、水文领域应用

    Python是功能强大.免费.开源,实现面向对象的编程语言,能够在不同操作系统和平台使用,简洁的语法和解释性语言使其成为理想的脚本语言.除了标准库,还有丰富的第三方库,Python在数据处理.科学计算 ...

  9. 基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用

     Python是功能强大.免费.开源,实现面向对象的编程语言,能够在不同操作系统和平台使用,简洁的语法和解释性语言使其成为理想的脚本语言.除了标准库,还有丰富的第三方库,Python在数据处理.科学计 ...

最新文章

  1. linux数组shell数组添加内容,shell数组的定义与应用
  2. alpine安装启动mysql_在php5-fpm-alpine docker容器中安装php-gd依赖于alpine linux
  3. 3.2.5 端到端的学习
  4. 1132 Cut Integer (20 分)【难度: 简单 / 知识点: 模拟】
  5. C++求tree树的高度(附完整源码)
  6. NumPy 数学函数
  7. selectByExample和selectByExampleWithBLOBs的区别
  8. ubuntu 下源码安装wireshark
  9. Java 并发(JUC 包-01)
  10. 1129 Recommendation System
  11. python中字符串函数的作用_python 基础学习笔记(2)---字符串功能函数
  12. 为何要使用大数据可视化平台
  13. HG255D[OpenWrt]从入门到精通
  14. 在html5水平边距属性hspace,HTML5 常用语法一览(列举不支持的属性)
  15. 如何从gitbub上clone代码
  16. Flask PyMongo的基本使用
  17. 【tkinter组件专栏】LabelFrame:规划布局frame的小老弟
  18. 掌握可视化设计流程这4步就够了
  19. php laravel入口文件,Laravel 应用的入口:路由系列之基础入门篇
  20. 【android】:android错误之Unparsed appt errors

热门文章

  1. 阿里旺旺发送文件以保存服务器,使用阿里旺旺收发文件
  2. python+selenium识别验证码实例
  3. 关于局域网共享excel链接问题
  4. Excel | 如何用Excel实现证件照底色调换
  5. CSP201903-4消息传递接口 从30分到AC 反思日记
  6. 计算机专业英语词典网址大全
  7. '#' 和 '##' 的作用
  8. 计算机二级59什么梗,计算机二级等级考试靠运气是个什么梗?
  9. win10安装oracle 12c报错[INS-30131] 附解决方法
  10. AI可以预测道路交叉口的车辆轨迹