matplotlib の plot_surface で ‘int’ object has no attribute ‘ndim’ というエラーが出る

投稿者: Anonymous

python3.6を使っています。
https://teratail.com/questions/81140
を参考にして、3次元の直方体を描こうと思ったのですが、できません。書いたコードは、上のurlのコードと全く同じで、次のようになります。

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

x = [-1,1]
y = [-1,1]
X,Y = np.meshgrid(x,y)

ax = plt.subplot(111, projection='3d')
ax.plot_surface(X,Y,1,alpha=0.7)
ax.plot_surface(X,Y,-1,alpha=0.7)
ax.plot_surface(X,1,Y,alpha=0.7)
ax.plot_surface(X,-1,Y,alpha=0.7)
ax.plot_surface(-1,X,Y,alpha=0.7)
ax.plot_surface(-1,X,Y,alpha=0.7)
ax.set_xlim(-2, 2)
ax.set_ylim(-2, 2)
ax.set_zlim(-2, 2)
plt.show()

しかし、spyderで打ち込むと、

in plot_surface
if Z.ndim != 2:


AttributeError: 'int' object has no attribute 'ndim'

とエラーを吐きます。
モジュールのバージョンは

numpy==1.14.0
matplotlib==2.1.2

です。

解決

引用元のコードは plot_surface へ渡す引数の内、1つを整数としています。
しかし現在、plot_surfaceが受けとる引数は3つとも、「Data values as 2D arrays」とのことなので、ここでエラーになっています。
適当に、2次元のnumpy配列などを作って利用すればよさそうです。

# 例
np.array([[1, 1], [1, 1]])

また、タイポだと思いますが、引用元のコードでは ax.plot_surface(-1,X,Y,alpha=0.7) が繰り返されており、一面が欠けている気がします。

上記2点を修正すると以下になります。

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

x = [-1, 1]
y = [-1, 1]
X, Y = np.meshgrid(x, y)
Z = np.array([[1, 1], [1, 1]])

ax = plt.subplot(111, projection='3d')
ax.plot_surface( X,  Y,  Z, alpha=0.7)
ax.plot_surface( X,  Y, -Z, alpha=0.7)
ax.plot_surface( X,  Z,  Y, alpha=0.7)
ax.plot_surface( X, -Z,  Y, alpha=0.7)
ax.plot_surface( Z,  X,  Y, alpha=0.7)
ax.plot_surface(-Z,  X,  Y, alpha=0.7)
ax.set_xlim(-2, 2)
ax.set_ylim(-2, 2)
ax.set_zlim(-2, 2)
plt.show()
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *