3

タイトルが示すように、matplotlib.mplot3d ラインプロットの z=0 サーフェスに Basemap マップをプロットしようとしています。Axes3D オブジェクトが (Axes3D.plot、Axes3D.scatter などを介して) z=0 面にプロットできることは知っていますが、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')
4

2 に答える 2

1

マップを 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()
于 2012-02-20T18:36:05.740 に答える
-2

AX.add_collection3d(M.drawcoastlines())

動作しますが

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

動作しません。

塗りつぶしを追加するとすぐに、「AttributeError: 'Polygon' object has no attribute 'do_3d_projection'」のようなエラーが表示されます。

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

add_collection() が必要とする入力の 1 つではなく、Polygon の配列を返します。collect.PatchCollection()どちらも機能していないようです。

では、`M.fillcontinents(lake_color='#888888', color='#282828') を 3D プロットに追加するには何を使用しますか?

于 2014-05-16T12:27:33.343 に答える