python气象数据可视化学习记录2——cartopy站点位置打点绘制_cartopy 气象数据绘图_qylirene的博客-程序员宅基地

技术标签: python  python气象数据可视化  数据可视化  

1. 图片效果

在这里插入图片描述

北京市大气环境监测站点示意图,如图所示,包含了三类站点的位置,每一类站点用不同颜色标记,并给出legend。

2. 代码解析

2.1 导入库

用到的画图库主要是cartopy和matplotlib,然后还有常用的pandas和numpy来读取和对数据做一些简单处理。也指定了图片默认的字体和字号。

import matplotlib as mpl
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import matplotlib.ticker as mticker
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
import pandas as pd
import numpy as np

mpl.rcParams["font.family"] = 'Arial'  #默认字体类型
mpl.rcParams["mathtext.fontset"] = 'cm' #数学文字字体
mpl.rcParams["font.size"] = 13

2.2 读取数据

所有的数据存在一个excel里面,然后根据不同的标签分成了3类,urban, suburban和rural

station=pd.read_excel('latlon.xlsx')
station_urban=station.loc[:,['东四','天坛','官园','万寿西宫','奥体中心','农展馆','万柳','北部新区','丰台花园']]
station_suburban=station.loc[:,['房山','大兴','亦庄','通州','顺义','昌平','门头沟',]]
station_rural=station.loc[:,['定陵','八达岭','密云水库','东高村','永乐店','榆垡','琉璃河']]

每一个dataframe大概是以下这种方式存储,第一行lon, 第二行lat。当然,这不是固定的,根据自己的需求来。
在这里插入图片描述

3.3 建立画布,绘制地图

这一步在前一篇博文地图绘制里面已经介绍,就不重复了。

proj = ccrs.PlateCarree()
fig = plt.figure(figsize=(6,4), dpi=100)  # 创建画布
ax = fig.subplots(1, 1, subplot_kw={
    'projection': proj})  # 创建子图
extent=[115,118,39.3,41.3]##经纬度范围
ax.set_extent(extent)
with open('C:/Users/qiuyu/.local/share/cartopy/shapefiles/natural_earth/physical/CN-border-La.dat') as src:
    context = src.read()
    blocks = [cnt for cnt in context.split('>') if len(cnt) > 0]
    borders = [np.fromstring(block, dtype=float, sep=' ') for block in blocks]
for line in borders:
    ax.plot(line[0::2], line[1::2], '-', color='k',lw=0.3, transform=ccrs.Geodetic())

3.4 添加经纬度

学习了一段时间的cartopy,目前认为最大的缺点就是经纬度添加实在是不如NCL方便。不过看帖子说最新版本的cartopy好像解决了这个问题。不过,这里我还是用matplotlib的笨方法来的。

#add lon and lat
gl=ax.gridlines(draw_labels=True,linestyle=":",linewidth=0.3, x_inline=False, y_inline=False,color='k')
gl.top_labels=False #关闭上部经纬标签
gl.right_labels=False
gl.xformatter = LONGITUDE_FORMATTER #使横坐标转化为经纬度格式
gl.yformatter = LATITUDE_FORMATTER
gl.xlocator=mticker.FixedLocator(np.arange(114,120,1))
gl.ylocator=mticker.FixedLocator(np.arange(38,43,1))
gl.xlabel_style={
    'size':12}#修改经纬度字体大小
gl.ylabel_style={
    'size':12}
ax.set_extent([114.99,118.01,39.3,41.3],crs=ccrs.PlateCarree())

3.5 画图打点

画图还是用的matplotlib里最简单的pyplot, 给定lon,lat来对应传统认知的x, y,最重要的是一定要添加transform=ccrs.Geodetic()来进行转换。可以对不同的分类选用不同的marker和颜色。

ax.plot(station_urban.iloc[0,:],station_urban.iloc[1,:], 'o', markersize=4, color='red',label='Station 1', transform=ccrs.Geodetic())
ax.plot(station_suburban.iloc[0,:],station_suburban.iloc[1,:], 'x', markersize=6, color='magenta',label='Station 2', transform=ccrs.Geodetic())
ax.plot(station_rural.iloc[0,:],station_rural.iloc[1,:], '^', markersize=6, color='seagreen',label='Station 3', transform=ccrs.Geodetic())

3.6 添加标题和legend

legend的位置,marker和文字的距离都是可以调节的,根据自己的需求来。当然,如果记不住参数的意思,去matplotlib的官网查询就一目了然啦。

#add title
ax.set_title('Location',fontsize=13)
#add legend
ax.legend(loc='upper right', bbox_to_anchor=(1.35, 0.75), borderaxespad=0,frameon=False,markerscale=2)

3.7 图片输出

如果存在图片输出不完整的情况,请一定要加上bbox_inches = 'tight’这个参数,就一下子都解决了。

plt.savefig('station.png',bbox_inches = 'tight')
plt.show()

3. 代码完整版

import matplotlib as mpl
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import matplotlib.ticker as mticker
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
import pandas as pd
import numpy as np

mpl.rcParams["font.family"] = 'Arial'  #默认字体类型
mpl.rcParams["mathtext.fontset"] = 'cm' #数学文字字体
mpl.rcParams["font.size"] = 13

station=pd.read_excel('latlon.xlsx')
station_urban=station.loc[:,['东四','天坛','官园','万寿西宫','奥体中心','农展馆','万柳','北部新区','丰台花园']]
station_suburban=station.loc[:,['房山','大兴','亦庄','通州','顺义','昌平','门头沟',]]
station_rural=station.loc[:,['定陵','八达岭','密云水库','东高村','永乐店','榆垡','琉璃河']]

proj = ccrs.PlateCarree()
fig = plt.figure(figsize=(6,4), dpi=100)  # 创建画布
ax = fig.subplots(1, 1, subplot_kw={
    'projection': proj})  # 创建子图
extent=[115,118,39.3,41.3]##经纬度范围
ax.set_extent(extent)
with open('C:/Users/qiuyu/.local/share/cartopy/shapefiles/natural_earth/physical/CN-border-La.dat') as src:
    context = src.read()
    blocks = [cnt for cnt in context.split('>') if len(cnt) > 0]
    borders = [np.fromstring(block, dtype=float, sep=' ') for block in blocks]
for line in borders:
    ax.plot(line[0::2], line[1::2], '-', color='k',lw=0.3, transform=ccrs.Geodetic())
#add lon and lat
gl=ax.gridlines(draw_labels=True,linestyle=":",linewidth=0.3, x_inline=False, y_inline=False,color='k')
gl.top_labels=False #关闭上部经纬标签
gl.right_labels=False
gl.xformatter = LONGITUDE_FORMATTER #使横坐标转化为经纬度格式
gl.yformatter = LATITUDE_FORMATTER
gl.xlocator=mticker.FixedLocator(np.arange(114,120,1))
gl.ylocator=mticker.FixedLocator(np.arange(38,43,1))
gl.xlabel_style={
    'size':12}#修改经纬度字体大小
gl.ylabel_style={
    'size':12}
ax.set_extent([114.99,118.01,39.3,41.3],crs=ccrs.PlateCarree())

ax.plot(station_urban.iloc[0,:],station_urban.iloc[1,:], 'o', markersize=4, color='red',label='Station 1', transform=ccrs.Geodetic())
ax.plot(station_suburban.iloc[0,:],station_suburban.iloc[1,:], 'x', markersize=6, color='magenta',label='Station 2', transform=ccrs.Geodetic())
ax.plot(station_rural.iloc[0,:],station_rural.iloc[1,:], '^', markersize=6, color='seagreen',label='Station 3', transform=ccrs.Geodetic())

#add title
ax.set_title('Location',fontsize=13)
#add legend
ax.legend(loc='upper right', bbox_to_anchor=(1.35, 0.75), borderaxespad=0,frameon=False,markerscale=2)

plt.savefig('station.png',bbox_inches = 'tight')
plt.show()
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qiuylulu/article/details/118732354

智能推荐

opencv 6 --cv2.absdiff-程序员宅基地

absdiff 获取差分图 就是将两幅图像作差两张图片进行对比,返回的结果代表他们的差异之处一般用在 比较与背景图的差异diff = cv2.absdiff(background, gray_lwpCV)两个图片相减,这里用的是灰度图,类型是uint8在 OpenCV单通道使用的数据类型是 uint8,两个uint8的数相减得不到负数,会得到差的补码...

{"errcode":41011,"errmsg":"missing agentid"}_corpsecret missing-程序员宅基地

用httpClient 发送消息,报错,但是我的agentId确实写了,原来是格式不对。package bridge;import java.io.IOException;import java.io.UnsupportedEncodingException;import org.apache.http.Consts;import org.apache.http.client.Clie_corpsecret missing

穿越沙漠-程序员宅基地

穿越沙漠Time Limit:1sMemory limit:32MAccepted Submit:237Total Submit:346一辆吉普车来到x公里宽的沙漠边沿A点,吉普车的耗油量为1升/公里,总装油量为500升。通常,吉普车必须用自身油箱中的油在沙漠中设置若干个临时储油点,才能穿越沙漠的。假设在沙漠边沿A点有充足

新学编程之掌握基本概念_育爱新学编程-程序员宅基地

1. 为什么要学习基本概念2. 如何学习基本概念2.1 理解基本概念的字面意思2.1.1 学习神器一2.1.2 学习神器二2.2 边实践边思考2.3 构建属于自己的知识框架3. 编程基本概念3.1 Python vs Anaconda3.2 变量3.3 Unicode 和 UTF-8 的不同之处........._育爱新学编程

DateTime.Now 和DateTime.UtcNow的区别-程序员宅基地

DateTime.UtcNow的区别UTC(协调世界时)时间DateTime.Now本地时间

linux的rc的几种解释_linux rc-程序员宅基地

前言在linux系统中,经常看到一些文件和目录都以rc开头或结尾,如:rcxinetd,~/.bashrc等文件,rc.d和rcX.d等目录。它的作用一般为:rc”是任何脚本类文件的后缀,这些脚本通常在程序的启动阶段被调用,通常是Linux系统启动时。以下是在网站找的几种解释:1、run commands较为普遍认可的说法:rc 是取自 runcom, 来自麻省理工学院在..._linux rc

随便推点

css 更改text样式,JavaScript 中用 cssText 设置 CSS 样式_蓝为一的博客-程序员宅基地

如果网页中一个 id 为“id1”的标签;想要在JavaScript 中设置这个元素的 CSS 样式,很一般的做法是:var obj = document.getElementById("id1");obj.style.width = "400px";obj.style.height = "300px";如果要设置一堆又一堆的 CSS 样式呢,太麻烦了吧。一般情况下都会结合 CSS 来添加 c...

LVM逻辑卷管理器_对逻辑卷mystorage/vo进行扩容,先卸载vo与挂载点中间的关联-程序员宅基地

LVM(逻辑卷管理器)可以允许用户对硬盘资源进行动态调整。(让用户灵活的变更分区的大小)逻辑卷管理器是Linux系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。而LVM技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把..._对逻辑卷mystorage/vo进行扩容,先卸载vo与挂载点中间的关联

web漏洞“小迪安全课堂笔记”文件操作安全,文件上传_小迪安全叫什么名字-程序员宅基地

思维导图利用思路什么是文件上传漏洞?指程序对文件的上传未作全面的限制,导致用户可以上传一些超越用户权限的一些文件,可以是木马,shell脚本,病毒等。文件上传漏洞有哪些危害?可以通过文件上传漏洞上传webshell后门。文件上传漏洞如何查找及判断?黑盒: 使用扫描工具扫描打开网站。黑盒:测试会员中心,测试后台。白盒:直接撸源代码。文件上传漏洞有哪些需要注意的地方?拿到漏洞后要对漏洞类型进行区分,编辑器、第三方应用、常规等。区分漏洞类型。关于文件上传漏洞在实际应用中的说明?上传_小迪安全叫什么名字

Hadoop(四)hdfs基本操作_hdfs option-程序员宅基地

HDFS是Hadoop的分布式文件系统,存储海量数据,通过多HDFS操作的了解,进一步了解HDFS。HDFS上的操作,通过两个方面来了解,1:shell客户端,2:Java客户端。一,shell客户端shell命令操作hdfs的一般格式为hadoop fs [option] [command]或者hdfs dfs [option] [command]1.1,opti..._hdfs option

Go语言int类型的指针变量与变量区别,指针变量的一些异常。_go *int-程序员宅基地

例1),声明一个指针变量,打印指针变量地址package mainimport "fmt" var p *int var d int fmt.Println(p) fmt.Println(d)执行结果如下:nil0【解释:由于指针变量未指向任何地址,所以打印值为 nil ,nil 相当于 java 中的(null),python中的(None),&p 取出指针变量的地址。上述代码int类型的指针变量和变量,根本区别,指针变量没有默认值,变量有默认值0】问题?因为指针变量没_go *int

bzoj3527: [Zjoi2014]力(fft)_matlab中带有下标的赋值维度不匹配sidelobe(:,n-w:n+w) = fftimage(-程序员宅基地

传送门fftfftfft菜题。题意简述:给一个数列aia_iai​,对于i=1→ni=1\rightarrow ni=1→n求出ansi=∑i<jai(i−j)2−∑i>jai(i−j)2ans_i=\sum_{i<j}\frac{a_i}{(i-j)^2}-\sum_{i>j}\frac{a_i}{(i-j)^2}ansi​=∑i&lt..._matlab中带有下标的赋值维度不匹配sidelobe(:,n-w:n+w) = fftimage(:,n-w:n+w)