web-dev-qa-db-ja.com

matplotlibの表面と3Dコンター

matplotlibを使用して、カラーマップ、ワイヤーフレーム、コンターで表面をプロットしたいと思います。このようなもの:

enter image description here

Xyに平行な平面にある輪郭ではなく、画像内の3Dおよび白の輪郭について質問していることに注意してください。

単純な方法でこれらすべてのものをプロットすると、等高線が見えなくなります(下のコードと画像を参照)。

import numpy as np
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
X, Y = np.mgrid[-1:1:30j, -1:1:30j]
Z = np.sin(np.pi*X)*np.sin(np.pi*Y)
ax.plot_surface(X, Y, Z, cmap="autumn_r", lw=0.5, rstride=1, cstride=1)
ax.contour(X, Y, Z, 10, lw=3, cmap="autumn_r", linestyles="solid", offset=-1)
ax.contour(X, Y, Z, 10, lw=3, colors="k", linestyles="solid")
plt.show()

enter image description here

サーフェイスファセットに透明度を追加すると、輪郭が表示されますが、実際に雑然として見えます(以下のコードと画像を参照)。

import numpy as np
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
X, Y = np.mgrid[-1:1:30j, -1:1:30j]
Z = np.sin(np.pi*X)*np.sin(np.pi*Y)
ax.plot_surface(X, Y, Z, cmap="autumn_r", lw=0.5, rstride=1, cstride=1, alpha=0.5)
ax.contour(X, Y, Z, 10, lw=3, cmap="autumn_r", linestyles="solid", offset=-1)
ax.contour(X, Y, Z, 10, lw=3, colors="k", linestyles="solid")
plt.show()

enter image description here

質問:matplotlibでこの結果を取得する方法はありますか?ただし、陰影は必要ありません。

10
nicoguaro

どうやらこれはバグです

import numpy as np
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
X, Y = np.mgrid[-1:1:30j, -1:1:30j]
Z = np.sin(np.pi*X)*np.sin(np.pi*Y)


ax.plot_surface(X, Y, Z, cmap="autumn_r", lw=0, rstride=1, cstride=1)
ax.contour(X, Y, Z+1, 10, lw=3, colors="k", linestyles="solid")
plt.show()

周りを回転させると、不必要なときに等高線が消えます。

2

オフセットを輪郭に設定したいと思います。

ax.contour(X, Y, Z, 10, offset=-1, lw=3, colors="k", linestyles="solid", alpha=0.5)

詳細については、この例を参照してください。

http://matplotlib.org/examples/mplot3d/contour3d_demo3.html

そして、ここのドキュメント:

http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#contour-plots

オフセット:指定された場合、zdirに垂直な平面内のこの位置に等高線の投影をプロットします

注意、 zdir = 'z'はデフォルトですが、xまたはy方向に投影して、それに応じてzdirを設定できます。

0
tmdavison