3d_basemap

matplotlib之 3D 元素的地图

mplot3d工具包创建3D地图

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) # 设置3d画布

# 1. 默认情况下轴旋转为一


# 2. 设置了轴旋转,以便从z轴观看地图,就像在2D中绘制地图时一样
"""
    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()

"""
    # 备注:
        1. ax 变量是Axes3D 实例, 将所有方法都在此实例中使用,因此需要支持3d操作.
        2. 带注释的块显示了如何旋转生成的地图,从而使视野更好
        3. 要绘制线条,只需要将add_collection3d方法与任何返回 matplotlib.patches.LineCollection
        对象的方法的输出一起使用. 例如 drawcountries
"""

填充多边形 Filling the polygons

"""
    # 1. 地图 的fillcontinents方法不会返回 add_collection3d支持的对象(PolyCollection,LineCollection,PatchCollection) , 而是返回maptplotlib.patches.Polygon对象的列表     
"""
from matplotlib.collections import PolyCollection
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 =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,edgecolors='black',facecolors='#DDDDDD',closed=False)

ax.add_collection3d(lc)
plt.show()
'''
    # 上述 所绘制 海岸线和国家
        1. 创建PolyCollection,需要使用多边形,地图对象将其放置子landpolygons字段中,其中包含多边形,例如国家/地区/其他
        2. 对于每个多边形,可以使用get_coords方法将坐标检索为浮点列表. 因为是geoslib.Polygon独享
        3. 一旦创建坐标列表,便可以构建PoilyCollection
        4. 在行中所做的那样,可以使用add_collection3d 添加PolyCollection
        5. 如果原始多边形是使用fillcontinents,添加的.则matplotlib表示没有将其转换为3d的方法
'''

添加3d条

'''
    #  未在其上绘制3d数据,则创建3d地图是没有任何意义的. 还Axes3D类具有绘制3d方法
'''

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,edgecolors='black',facecolors="#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()

'''
    # 备注:
        1. 使用set_axis_off方法消除轴
        2. bar3d 需要x,y和z位置. 以及增量x,y和z. 要正确绘制,z位置必须为0,且增量z为最终值
'''
posted @ 2021-06-01 08:34  染指未来  阅读(139)  评论(0编辑  收藏  举报