43815


python3.5を使っています。例えば３次元プロットを２次元に射影するためには次のようなコードで書けます。

[code]

    import matplotlib.pyplot as plt
    import numpy as np
    
    f = lambda x,y: np.exp(-(x**2 + y**2))
    
    x = np.linspace(-4,4,100)
    y = np.linspace(-4,4,100)
    X,Y = np.meshgrid(x,y)
    Z = f(X,Y)
    plt.figure()
    #ax = plt.subplot(121, projection='3d')
    #ax.plot_surface(X,Y,Z,cmap='Reds')
    ax = plt.subplot(111)
    cs = ax.contourf(X,Y,Z,100, cmap='Reds')
    plt.colorbar(cs)
    plt.show()
    
[/code]

これを実行すると次のような２次元グラフが得られます。  
[![画像](https://i.stack.imgur.com/raZ6P.png)](https://i.stack.imgur.com/raZ6P.png)  
これを参考にして、ある行列を与えられたときに、行列の縦と横をx軸、y軸とし、行列の各要素をｚ座標の値として扱って同じような２次元グラフを書きたいです。次は試しに書いてみたコードです。

[code]

    import matplotlib.pyplot as plt
    import numpy as np
    
    n_number=21
    lam_number=21
    mat=np.zeros((n_number,lam_number))
    #print(mat)
    for i in range(0,n_number):
        for j in range(0,lam_number):
            mat[i][j]=(i-10)**2+(j-10)**2
    
    x=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
    y=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
    print(x)
    
    X,Y = np.meshgrid(x,y)
    print(x)
    f = lambda x,y: mat[x][y]
    Z = f(X,Y)
    print(Z.shape)
    
    
    #ax = plt.subplot(121, projection='3d')
    #ax.plot_surface(X,Y,Z,cmap='Reds')
    ax = plt.subplot(111)
    cs = ax.contourf(X,Y,Z[0][0],100, cmap='Reds')
    plt.colorbar(cs)
    plt.show()
    
[/code]

これを実行すると、`TypeError: Input z must be a 2D
array.`とエラーを吐きます。確かに、Zの形を見てみると`Z.shape=(21,21,21,21)`でした。

また、

[code]

    import matplotlib.pyplot as plt
    import numpy as np
    
    n_number=21
    lam_number=21
    mat=np.zeros((n_number,lam_number))
    #print(mat)
    for i in range(0,n_number):
        for j in range(0,lam_number):
            mat[i][j]=(i-10)**2+(j-10)**2
    
    x=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
    y=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
    print(x)
    
    X,Y = np.meshgrid(x,y)
    print(x)
    f = lambda x,y: mat[x][y]
    Z = f(X,Y)
    print(Z.shape)
    
    
    plt.figure()
    ax = plt.subplot(111)
    cs=ax.contourf(x,y,mat[x][y],cmap="Reds")
    plt.colorbar(cs)
    plt.show()
    
[/code]

としたところ、下のようにカクカクのグラフが得られました。  
[![画像２](https://i.stack.imgur.com/vaLjx.png)](https://i.stack.imgur.com/vaLjx.png)  
しかし、より滑らかな図形を得たいので、やはり`X,Y = np.meshgrid(x,y)`を使って書いてみたいです。


CC BY-SA 4.0
2018-05-05T10:15:52.820
43807
2018-05-05T23:38:18.157
26529
question
python matplotlib
pythonで行列を3次元のように２次元でプロットしたい。


０から20までを、例えば0.1毎にプロットする場合は、NumPyでは次のように書けます。

[code]

    x = np.linspace(0,20,201)
    
[/code]

そこで`X,Y = np.meshgrid(x,y)`を使うと以下のように書けます。

[code]

    import matplotlib.pyplot as plt
    import numpy as np
    
    f = lambda x,y: (x-10)**2 + (y-10)**2
    
    x = np.linspace(0,20,201)
    y = np.linspace(0,20,201)
    X,Y = np.meshgrid(x,y)
    Z = f(X, Y) 
    plt.figure()
    ax = plt.subplot()
    cs = ax.contourf(X,Y,Z,20, cmap='Reds')
    plt.colorbar(cs)
    plt.show()
    
[/code]

上の試しに書いた例では次のように変更すればエラーが出なくなります。NumPyの関数はベクトル演算をします。

[code]

    x=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
    y=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
    print(x)
    
    X,Y = np.meshgrid(x,y)
    print(x)
    f = lambda i,j: (i-10)**2+(j-10)**2
    Z = f(X,Y)
    print(Z.shape)
    
    #ax = plt.subplot(121, projection='3d')
    #ax.plot_surface(X,Y,Z,cmap='Reds')
    ax = plt.subplot(111)
    cs = ax.contourf(X,Y,Z,100, cmap='Reds')
    plt.colorbar(cs)
    plt.show()
    
[/code]

また、最後の例でカクカクのグラフになっているのは等高線の数が少ないためで、以下のようにすればカクカクはなくなります。

[code]

    cs=ax.contourf(x,y,mat,100,cmap="Reds")
    
[/code]


CC BY-SA 4.0
2018-05-05T22:47:54.973
43815
2018-05-05T23:38:18.157
2018-05-05T23:38:18.157
15171
15171
43807
answer