前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Basemap工具函数(3)

Basemap工具函数(3)

作者头像
bugsuse
发布于 2020-04-21 09:26:07
发布于 2020-04-21 09:26:07
1.1K00
代码可运行
举报
文章被收录于专栏:气象杂货铺气象杂货铺
运行总次数:0
代码可运行

rotate_vector

给定向量场的 东西 和 南北 方向分量以及经纬度点,然后对向量进行旋转,使向量场在地图投影上以适当的方向显示。

一些函数(比如 barbs,quiver,streamplot)使用的是向量数据,要求向量分量是地图坐标系(比如 u 是左右方向,v 是上下方向)。如果可用数据是地理学坐标系的(比如东西方向,南北方向),这些坐标必须进行转换,否则所绘制的向量方向会很怪异。这就是 rotate_vertor 方法的目的。

transform_scalar 方法也能完成同样的工作,但同时也会改变网格大小(插值)。

rotate_vector(uin, vin, lons, lats, returnxy=False)

  • uin 和 vin 是输入数据矩阵。方向是地理学坐标中的方向,u 是东西方向分量, v 是南北方向分量
  • lons 和 lats 是和 uin 及 vin 矩阵相对应的位置数组(二维)。也是地理学坐标
  • returnxy 会使方法返回重新投影到地图坐标的 lons 和 lats 矩阵
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np


fig=plt.figure(figsize=(9, 3))


map = Basemap(projection='sinu', 
              lat_0=0, lon_0=0)

lons = np.linspace(-180, 180, 10)
lats = np.linspace(-90, 90, 10)

lons, lats = np.meshgrid(lons, lats)

v10 = np.ones((lons.shape)) * 15
u10 = np.zeros((lons.shape))

u10_rot, v10_rot, x, y = map.rotate_vector(u10, v10, lons, lats, returnxy=True)

ax = fig.add_subplot(121)
ax.set_title('Without rotation')

map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='#cc9955', lake_color='aqua', zorder = 0)
map.drawcoastlines(color = '0.15')


map.barbs(x, y, u10, v10, 
    pivot='middle', barbcolor='#333333')

ax = fig.add_subplot(122)
ax.set_title('Rotated vectors')

map.drawmapboundary(fill_color='9999FF')
map.fillcontinents(color='#ddaa66', lake_color='9999FF', zorder = 0)
map.drawcoastlines(color = '0.15')

map.barbs(x, y, u10_rot, v10_rot, 
    pivot='middle', barbcolor='#ff7777')

plt.show()
  • lons 和 lats 被创建为覆盖全球的等间距网格
  • v10 和 u10 为风分量 (v10 = 10, u10 = 0)
  • 对创建的矩阵进行旋转并且计算在地图投影中的位置(returnxy = True)
  • 使用 add_subplot 方法创建子图并绘制两个图 1) 第一张图没有进行旋转。尽管假设风场为南北方向,但 barbs 显示出为由低到顶,而不是由南到北 2) 第二张图展示的是旋转后的结果

set_axes_limits

此方法通常被用于改变 matplotlib axes以改变投影的形状。通常在内部进行调用。

set_axes_limits(ax=None)

  • ax 是需要改变范围的 axis 实例

大部分方法,比如 drawcountries, drawrivers, readshapefile等,都会在最后调用此方法。因此很难使用例子展示其是如何起作用的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
fig = plt.figure()

map = Basemap(projection='ortho', 
              lat_0=0, lon_0=0)

map.drawlsmask(land_color = "#ddaa66", 
               ocean_color="#7777ff",
               resolution = 'c')

x1, y1 = map(-60, -30)
x2, y2 = map(0, 0)
x3, y3 = map(45, 45)

plt.plot([x1, x2, x3], [y1, y2, y3], color='k', linestyle='-', linewidth=2)

ax1 = fig.add_axes([0.1, 0., 0.15, 0.15])
ax1.set_xticks([])
ax1.set_yticks([])

ax1.plot([x1, x2, x3], [y1, y2, y3], color='k', linestyle='-', linewidth=2)

map.set_axes_limits(ax=ax1)

ax2 = fig.add_axes([0.3, 0., 0.15, 0.15])
ax2.set_xticks([])
ax2.set_yticks([])

ax2.plot([x1, x2, x3], [y1, y2, y3], color='k', linestyle='-', linewidth=2)

ax3 = fig.add_axes([0.5, 0., 0.15, 0.15])
ax3.set_xticks([])
ax3.set_yticks([])

map.plot([x1, x2, x3], [y1, y2, y3], color='k', linestyle='-', linewidth=2, ax=ax3)

plt.show()

shiftdata

添加经度值从而正确适应地图。改变数据数组也能适应新的地图。有时候,精度数据给定的间隔范围是从 -180 到 180,或是从 0 到 360。要正确绘图,数据必须要进行转换。

shiftdata(lonsin, datain=None, lon_0=None)

  • lonsin 是原始经度数据。必须是一维或二维数组,但总是规则的 lat/lon 网格
  • datain 是数据数组。如果 longitudes 必须要分割(比如,-180 变为 360),那么数据的顺序必要要改变。如果给定了数据,则执行此操作。
  • lon_0 是地图的原点.。经度为[lon_0-180, lon_0 + 180]区间
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

map = Basemap(projection='sinu', 
              lat_0=0, lon_0=0)

lons = np.arange(30, 390, 30)
lats = np.arange(0, 100, 10)

data = np.indices((lats.shape[0], lons.shape[0]))
data = data[0] + data[1]

print data

print lons

lons, data = map.shiftdata(lons, datain = data, lon_0=0)

print lons

llons, llats = np.meshgrid(lons, lats)

x, y = map(llons, llats)

map.contourf(x, y, data)

map.drawcoastlines()
plt.show()
  • 坐标和数据不是严格意义上的经纬度和有意义的数据。坐标是简单的范围,而数据是 x 和 y 坐标的和。因此,左下角值最小,右上角值最大。

注意:经度以 30 为起始点。

  • 使用 shiftdata 转换经度和数据
  • 使用 meshgrid 方法转换lons 和 lats 为二维数组,并且使用 basemap 实例对地图投影进行重新投影
  • 绘制填充等值线图
  • 最终会出现一块白色区域,可使用 addcyclic 方法解决

应用此方法到数据后的结果

未使用此方法的结果。注意:蓝色(值为0)区域起始点不是经度=0

未使用此方法的结果。注意结果和预期不同,因为经度在正确区间外

shiftgrid

此函数和 shiftdata 方法类似。向西或向东以东所有经度和数据。

basemap.shiftgrid(lon0, datain, lonsin, start=True, cyclic=360.0)

  • 注意这不是 basemap实例方法,而是basemap模块中的函数
  • lon_0 是最终格点的起始或终止经度。必须在输入经度区间内,因此有时要设置为起始点,有时作为终止点(设置 start 参数)
  • datain 是输入数据数组,将根据经度进行重新排序
  • lonsin 是要进行转换的输入经度,是一维数组,但不一定是均匀间隔
  • start 参数,默认是True。如果 lon0是经度的初始点或是输出数组的最后一个点,要设置 start
  • cyclic 设置经度值,经度在[0 lon0]区间
  • 函数返回被排序后的数据和转换后的经度

注意:

和 shiftdata 的主要差异是:投影不需要是 cylindrical,因为这不是 basemap 实例方法,而且经度也不需要是均匀间隔的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from mpl_toolkits.basemap import Basemap
from mpl_toolkits.basemap import shiftgrid
import matplotlib.pyplot as plt
import numpy as np

map = Basemap(projection='sinu', 
              lat_0=0, lon_0=0)

lons = np.arange(30, 410, 30)
lons[1] = 70
lats = np.arange(0, 100, 10)

data = np.indices((lats.shape[0], lons.shape[0]))
data = data[0] + data[1]

print data
print lons

data, lons = shiftgrid(180., data, lons, start=False)

print data
print lons

llons, llats = np.meshgrid(lons, lats)

x, y = map(llons, llats)

map.contourf(x, y, data)
map.drawcoastlines()
plt.show()
  • 坐标和数据不是严格意义上的经纬度和有意义的数据。坐标是简单的范围,而数据是 x 和 y 坐标的和。因此,左下角值最小,右上角值最大。

注意:经度以 30 为起始点。

第二个元素由60改为70,以说明经度可以不是均匀间隔

  • 使用 shiftgrid 转换经度和数据 1)lon0 设置为 180,start = False,因此最终经度为 180 2)不可能设置 lon0 为 -180,因为这在经度区间之外,因此必须要使用上述方法。
  • 使用 meshgrid 方法转换lons 和 lats 为二维数组,并且使用 basemap 实例对地图投影进行重新投影
  • 绘制填充等值线图
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Basemap工具函数(2)
对于创建平滑图形或使用 barbs 或 quiver 绘图时非常有用。当使用 maskoceans 函数时也非常有用。
bugsuse
2020/04/21
1.7K0
Basemap工具函数(2)
Basemap工具函数(4)
Tissot 指示图或 Tissot 歪曲椭圆是在地图上显示圆,展示了这些圆是如何适应投影的(即,在不同的位置出现了球面相同的曲率)。通常,不同的位置会出现不同的扭曲度。
bugsuse
2020/04/21
1.5K0
Basemap工具函数(4)
Basemap系列教程:绘图
(1) reduce_C_function 参数用于显示每一个 bin 的最大值,从而代替平均值
bugsuse
2020/04/21
4.4K0
Basemap系列教程:绘图
Basemap工具函数(1)
添加一个经度值到经度数组中,并且添加一列值到数据数组中。当数据覆盖全部经度时,非常有利于添加缺省值。
bugsuse
2020/04/21
2.3K0
Basemap工具函数(1)
Basemap系列教程:绘制子图及小地图
使用 matplotlib 中的 subplots 可以在同一个 figure 中绘制多个地图。有几种方法可以实现这种图形的绘制,而且根据所绘图形的复杂性来选择不同的方法:
bugsuse
2020/04/20
5.2K0
Python | 绘制影像地图(Basemap)
文中代码与数据请点击https://pan.bnu.edu.cn/v/link/view/0cd746194a1e42858583e84ac7fc4e40直接下载,不需要转存。
GIS与遥感开发平台
2022/04/29
6.9K0
Python | 绘制影像地图(Basemap)
Basemap系列教程:背景方法
使用背景方法可以绘制用户数据到地图。这些方法对于绘制 borders,lands等是非常有用的。下面我们就来介绍一下这些内容。
bugsuse
2020/04/21
3.4K0
Basemap系列教程:背景方法
Basemap系列教程:读取WRF模式数据
Basemap 特别擅长绘制数值天气模式输出数据,比如 WRF。WRF [注1] 模式是广泛使用的数值预报模式,只要变量名合适,大部分情况下都可以使用其它模式的输出来运行。
bugsuse
2020/04/20
1.9K1
数据科学 IPython 笔记本 8.16 地理数据和 Basemap
数据科学中一种常见的可视化类型是地理数据。Matplotlib 用于此类可视化的主要工具是 Basemap 工具包,它是位于mpl_toolkits命名空间下的几个 Matplotlib 工具包之一。不可否认,Basemap 使用时有点笨拙,甚至简单的可视化渲染也要花费更长的时间,超出你的想象。
ApacheCN_飞龙
2022/05/07
1.7K0
数据科学 IPython 笔记本 8.16 地理数据和 Basemap
Basemap系列教程之基本函数
主要有两种方法绘制栅格,contour/contourf 绘制等值线或填充等值线图,pcolor/pcolormesh 绘制伪彩色图。
bugsuse
2020/04/20
2.9K0
Matplotlib的朋友Basemap
https://blog.csdn.net/weixin_44510615/article/details/90732373 https://blog.csdn.net/weixin_44510615/article/details/90732196
润森
2019/10/30
2K0
Matplotlib的朋友Basemap
[Python从零到壹] 十八.可视化分析之Basemap地图包入门详解
欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。
Eastmount
2022/11/25
9550
绘图: matplotlib Basemap简介
在数据可视化过程中,我们常常需要将数据根据其采集的地理位置在地图上显示出来。比如说我们会想要在地图上画出城市,飞机的航线,乃至于军事基地等等。通常来说,一个地理信息系统都会带有这样的功能。今天我们讨论如何在Python上实现,并且使用免费的工具包。 matplotlib是Python常用的数据绘制包。它基于numpy的数组运算功能。matplotlib绘图功能强大,可以轻易的画出各种统计图形,比如散点图,条行图,饼图等。matplotlib常与numpy和scipy相配合,用于许多研究领域。他们是免费工具,
Vamei
2018/01/18
2.2K0
绘图: matplotlib Basemap简介
Basemap系列:管理投影
所有的地图都拥有一个投影。投影方式及其特征在Basemap对象创建时确定。这种方式和其他库(比如 GDAL)的做法具有很大不同。
bugsuse
2020/04/20
1.6K0
Basemap系列教程:3D
尽管很多人不喜欢3D地图,但是仍可以使用 Basemap 和 matplotlib mplot3d [注1] 工具绘制3D地图。
bugsuse
2020/04/21
1.5K0
Basemap系列教程:3D
Python数据可视化与basemap数据地图系列2——点线图
前一篇介绍了如何使用mpl_toolkits包中的basemap模块制作填充地图,这一节继续分享线图+点图的应用。
数据小磨坊
2018/07/25
3.1K0
Python数据可视化与basemap数据地图系列2——点线图
Basemap系列教程:使用shapefiles绘制地图
译注:绘制地图时因为一些原因可能需要使用shapefile添加地图信息,比如很多软件中的关于中国的地图信息都不是很准确,当要明确标注中国边界信息时就会出问题。这次就介绍一下如何利用shp文件添加地图信息。
bugsuse
2020/04/20
4.7K0
python basemap制作utm遥感图(改)
投影坐标是正确了,但是不美观啊,不过暂时也只能这样了。。。慢慢琢磨有没有其他参数可以修改吧。。。另外还有一个问题就是0值镂空,暂时也还没完善。
一个有趣的灵魂W
2020/09/15
1K0
python basemap制作utm遥感图(改)
小蛇学python(23)basemap入门与进阶
Basemap是matplotlib下的一个库文件,专门应用于绘制地图。这一节就来详细讲解该文件的使用。首先来绘制一个最简单的地图。代码结果如图1所示。
用户2145057
2020/02/18
1K0
小蛇学python(23)basemap入门与进阶
Python-Basemap 绘图初尝试
要想使用python绘制一般二维的空间数据可视化,Basemap这个库就不得不提,虽将不再进行维护,但其较完整的绘图体系,对绝大多数的地理空间数据可视化绘制已足够满足需求,下面,将结合实例对Python-Basemap的常用设置进行讲解。
DataCharm
2021/02/22
6770
Python-Basemap 绘图初尝试
相关推荐
Basemap工具函数(2)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文