42441


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

[code]

    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()
    
[/code]

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

[code]

    in plot_surface
    if Z.ndim != 2:
    
    
    AttributeError: 'int' object has no attribute 'ndim'
    
[/code]

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

numpy==1.14.0  
matplotlib==2.1.2

です。


CC BY-SA 3.0
2018-03-16T08:10:05.967
42435
2018-03-16T15:16:50.657
2018-03-16T11:18:41.877
3054
26529
question
python python3 matplotlib
matplotlib の plot_surface で 'int' object has no attribute 'ndim' というエラーが出る


引用元のコードは `plot_surface` へ渡す引数の内、1つを整数としています。  
しかし現在、[`plot_surface`](https://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#surface-
plots)が受けとる引数は3つとも、「Data values as 2D arrays」とのことなので、ここでエラーになっています。  
適当に、2次元のnumpy配列などを作って利用すればよさそうです。

[code]

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

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

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

[code]

    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()
    
[/code]


CC BY-SA 3.0
2018-03-16T11:16:41.703
42441
2018-03-16T15:16:50.657
2018-03-16T15:16:50.657
3054
3054
42435
answer