使用matplotlib从2D矩阵生成3D表面

时间:2018-03-21 07:30:47

标签: python matplotlib

在python中使用2d矩阵,如何创建3d曲面图,其中columns = x,rows = y,值是z中的高度?

我无法理解如何使用matplotlib创建3D曲面图。 也许它与MatLab不同。

示例:

from pylab import *
from mpl_toolkits.mplot3d import Axes3D

def p(eps=0.9, lmd=1, err=10e-3, m=60, n=40):

    delta_phi = 2 * np.pi / m
    delta_lmd = 2 / n
    k = 1
    P0 = np.zeros([m + 1, n + 1])
    P = np.zeros([m + 1, n + 1])
    GAP = 1

    while GAP >= err:
        k = k + 1
        for i in range(0, m):
            for j in range(0, n):
                if (i == 1) or (j == 1) or (i == m + 1) or (i == n + 1):
                    P[i,j] = 0
                else:
                    A = (1+eps*np.cos((i+1/2)*delta_phi))**3
                    B = (1+eps*np.cos((i-1/2)*delta_phi))**3
                    C = (lmd*delta_phi/delta_lmd)**2 * (1+eps*np.cos((i)*delta_phi))**3
                    D = C
                    E = A + B + C + D
                    F = 3*delta_phi*((1+eps*np.cos((i+1/2)*delta_phi))-(1+eps*np.cos((i-1/2)*delta_phi)))
                    P[i,j] = (A*P[i+1,j] + B*P[i-1,j] + C*P[i,j+1] + D*P[i,j-1] - F)/E
                    if P[i,j] < 0:
                        P[i,j] = 0
        S = P.sum() - P0.sum()
        T = P.sum()
        GAP = S / T
        P0 = P.copy()
    return P, k

def main():
    start = time.time()
    eps = 0.9
    lmd = 1
    err = 10e-8
    m = 60
    n = 40
    P, k = p()

    fig = figure()
    ax = Axes3D(fig)
    X = np.linspace(0, 2*np.pi, m+1)
    Y = np.linspace(-1, 1, n+1)
    X, Y = np.meshgrid(X, Y)
    #Z = P[0:m, 0:n]
    #Z = Z.reshape(X.shape)
    ax.set_xticks([0, np.pi/2, np.pi, np.pi*1.5, 2*np.pi])
    ax.set_yticks([-1, -0.5, 0, 0.5, 1])
    ax.plot_surface(X, Y, P)
    show()


if __name__ == '__main__':
    main()
  

ValueError:形状不匹配:无法将对象广播到单个对象   形状

和照片 pic by matplotlic

我还使用MatLab生成,图片: pic by MatLab

2 个答案:

答案 0 :(得分:0)

我认为这是一个让观念直截了当的问题。 m*n矩阵是一个包含m行和n列的矩阵。因此,Y的长度mX长度为n,因此在网格化XYP之后所有人都有(m,n)的形状。

此时不需要重新构建reindex并只需绘制

ax.plot_surface(X, Y, P) 

会给你想要的结果。

答案 1 :(得分:0)

假设您有一个矩阵mat

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


h, w = mat.shape
plt.figure(figsize=(16, 8))
ax = plt.axes(projection='3d')
X, Y = np.meshgrid(np.arange(w), np.arange(h))
ax.plot_surface(X, Y, mat, rstride=1, cstride=1, cmap='viridis', edgecolor='none', antialiased=False)