专栏首页气象杂货铺Basemap系列教程:3D

Basemap系列教程:3D

尽管很多人不喜欢3D地图,但是仍可以使用 Basemap 和 matplotlib mplot3d [注1] 工具绘制3D地图。

创建基本地图

当使用 matplotlib 绘制3D图时,最重要的一点是,要使用 Axes3D 类。使用 add_collection3d 可以添加地理数据到地图中。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.basemap import Basemap

map = Basemap()

fig = plt.figure()
ax = Axes3D(fig)

'''
ax.azim = 270
ax.elev = 90
ax.dist = 5
'''

ax.add_collection3d(map.drawcoastlines(linewidth=0.25))
ax.add_collection3d(map.drawcountries(linewidth=0.35))

plt.show()
  • 此例中 ax 是 Axes3D 实例变量。使用的所有方法都源自此实例,因此需要支持 3D 操作。对于 basemap 方法来说,大多数情况下都不支持。
  • 注释部分显示了如何旋转地图以获得更好的视图
  • 要绘制海岸线,可将 basemap方法的结果作为参数传递给 add_collection3d 方法

基本用法。轴的旋转是默认的

轴的旋转设置为由 z 轴向下看,看起来就像是 2D图形

填充多边形

不幸的是, basemap 的 fillcontinents 方法不能返回 add_collection3d 支持的对象(PolyCollection, LineColleciton, PatchCollection),而是 matplotlib.patches.Polygon 对象列表。

解决办法就是创建 PolyCollection 对象。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.basemap import Basemap
from matplotlib.collections import PolyCollection

map = Basemap()

fig = plt.figure()
ax = Axes3D(fig)

ax.azim = 270
ax.elev = 50
ax.dist = 8

ax.add_collection3d(map.drawcoastlines(linewidth=0.25))
ax.add_collection3d(map.drawcountries(linewidth=0.35))

polys = []
for polygon in map.landpolygons:
    polys.append(polygon.get_coords())


lc = PolyCollection(polys, edgecolor='black',
                    facecolor='#DDDDDD', closed=False)

ax.add_collection3d(lc)


plt.show()
  • 要创建 PolyCollection 就需要 polygons,而在 Basemap 对象的 landpolygons 域中就存在 polygons
  • 对于每一个 polygons 来说, 使用 get_coords 方法可以提取一系列浮点坐标
  • 一旦坐标列表创建了,那么就可以创建 PoilyCollection
  • 使用 add_collection3d 添加 PolyCollection
  • 如果使用 fillcontinents 添加 polygon, matplotlib 没有任何方法可以将其转换为 3D

添加3D 条形图

如果没有添加数据到地图上,那么绘制3D地图将没有任何意义。 Axes3D 类有 bar3d 方法用于绘制 3D 条形图。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.basemap import Basemap
from matplotlib.collections import PolyCollection
import numpy as np

map = Basemap(llcrnrlon=-20,llcrnrlat=0,urcrnrlon=15,urcrnrlat=50,)

fig = plt.figure()
ax = Axes3D(fig)

ax.set_axis_off()
ax.azim = 270
ax.dist = 7

polys = []
for polygon in map.landpolygons:
    polys.append(polygon.get_coords())


lc = PolyCollection(polys, edgecolor='black',
                    facecolor='#DDDDDD', closed=False)

ax.add_collection3d(lc)
ax.add_collection3d(map.drawcoastlines(linewidth=0.25))
ax.add_collection3d(map.drawcountries(linewidth=0.35))

lons = np.array([-13.7, -10.8, -13.2, -96.8, -7.99, 7.5, -17.3, -3.7])
lats = np.array([9.6, 6.3, 8.5, 32.7, 12.5, 8.9, 14.7, 40.39])
cases = np.array([1971, 7069, 6073, 4, 6, 20, 1, 1])
deaths = np.array([1192, 2964, 1250, 1, 5, 8, 0, 0])
places = np.array(['Guinea', 'Liberia', 'Sierra Leone','United States', 'Mali', 'Nigeria', 'Senegal', 'Spain'])

x, y = map(lons, lats)

ax.bar3d(x, y, np.zeros(len(x)), 2, 2, deaths, color= 'r', alpha=0.8)

plt.show()
  • 放大地图以适应 Ebola 数据集
  • 使用 set_axis_off 方法去除 axis
  • bar3d 需要 x,y 和 z 的位置,加上 delta x,y,z。为了合适的绘制图形,z 必须是0,而 delta z 就是最终的数据值

注1:http://matplotlib.org/mpl_toolkits/mplot3d/

本文分享自微信公众号 - 气象杂货铺(meteogs),作者:lightning

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-03-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用 Cartopy 和 netCDF4 可视化 WRF 模式数据

    对比使用 Basemap,gdal 和 Cartopy,netCDF4 读取 WRF 模式数据并绘图。

    bugsuse
  • Basemap系列教程:绘制子图及小地图

    使用 matplotlib 中的 subplots 可以在同一个 figure 中绘制多个地图。有几种方法可以实现这种图形的绘制,而且根据所绘图形的复杂性来选择...

    bugsuse
  • Basemap系列教程:绘图

    (1) reduce_C_function 参数用于显示每一个 bin 的最大值,从而代替平均值

    bugsuse
  • javascript基础之两种函数的定义方法

    wfaceboss
  • MySQL user表被删除了怎么办

    技术交流群总是能带来很多实际生产环境遇到的问题,例如,近期就有人遇到user表内容被清空的情况。如果发生了此情况,千万不要慌,更不能隐瞒问题(这位朋友就比较惨,...

    July
  • Ubuntu 下如何修改 MySQL 密码

    Ubuntu 下如何修改 MySQL 密码呢?搜集大致有以下几种方式、应该是比较常用的方法

    hedeqiang
  • python 热力图heatmap

    py3study
  • 12个案例教你用Python玩转数据可视化

    作者 | 伊凡·伊德里斯(Ivan Idris),曾是Java和数据库应用开发者,后专注于Python和数据分析领域,致力于编写干净、可测试的代码。他还是《Py...

    AI科技大本营
  • hadoop streaming编程小demo(python版)

    大数据团队搞数据质量评测。自动化质检和监控平台是用django,MR也是通过python实现的。(后来发现有orc压缩问题,python不知道怎么解决,正在改成...

    用户1225216
  • 干货:12个案例教你用Python玩转数据可视化(建议收藏)

    导读:相比于科学,数据分析更像是一门艺术。创建样式优美的数据可视化是这个艺术中不可缺少的部分。然而,某些人认为优美的,也会有人觉得难以接受。和艺术类似,随着数据...

    华章科技

扫码关注云+社区

领取腾讯云代金券