Базовая карта на лице куба matplotlib.mplot3d - PullRequest
3 голосов
/ 28 мая 2011

Как видно из заголовка, я пытаюсь нанести карту базовой карты на поверхность z = 0 линейного графика matplotlib.mplot3d. Я знаю, что объект Axes3D способен строить на поверхности с z = 0 (через Axes3D.plot, Axes3D.scatter и т. Д.), Но я не могу понять, как это сделать с объектом Basemap. Надеюсь, код ниже показывает, что мне нужно достаточно четко. Любые идеи будут высоко оценены!

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

# make sample data for 3D lineplot
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)

# make the 3D line plot
FIG = ct.pp.figure()
AX = Axes3D(FIG)
AX.plot(x, y, z, '-b')

# make the 2D basemap
### NEEDS TO SOMEHOW BE AT z=0 IN FIG
M = ct.Basemap(projection='stere', width=3700e3, height=2440e3,
               lon_0=-5.0, lat_0=71.0, lat_ts=71.0,
               area_thresh=100, resolution='c')
PATCHES = M.fillcontinents(lake_color='#888888', color='#282828')

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Просто добавьте свою карту в виде 3D-коллекции в экземпляр Axes3D:

import numpy as np
import matplotlib.pyplot as pp
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.basemap import Basemap

theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-500, 500, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)

FIG = pp.figure()
AX = Axes3D(FIG)
AX.plot(x, y, z, '-b')

M = Basemap(projection='stere', width=3700e3, height=2440e3,
               lon_0=-5.0, lat_0=71.0, lat_ts=71.0,
               area_thresh=100, resolution='c')
AX.add_collection3d(M.drawcoastlines())
AX.grid(True)

pp.draw()
pp.show()
0 голосов
/ 16 мая 2014

AX.add_collection3d(M.drawcoastlines())

работает, но

PATCHES = M.fillcontinents(lake_color='#888888', color='#282828')

не работает.

Как только вы добавляете заливку цветом, вы получаете ошибку, похожую на: «AttributeError: у объекта 'Polygon' нет атрибута 'do_3d_projection'"

M.fillcontinents(lake_color='#888888', color='#282828')`

возвращает массив полигонов, а не один из входных данных, требуемых add_collection (). collect.PatchCollection(), похоже, тоже не работает.

Так что же вы используете для добавления `M.fillcontinents (lake_color = '# 888888', color = '# 282828') к трехмерному графику?

...