在网格中绘制具有不同宽度的曲面蟒蛇

时间:2012-12-04 03:50:31

标签: python matplotlib

我试图用python绘制一个3d表面,实际上我有这个代码:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
from numpy import *

def f(x,y):
    r=x**2 + y**2
    return r

n=4.
b=1.
a=-b
h=(2*b)/n
print h
hx=h ##This line##
fig = plt.figure()
ax = Axes3D(fig)
X = arange(a, b+hx, hx)
Y = arange(a, b+h, h)
n = len(X)
m = len(Y)
Z = zeros([n,m])

for i in arange(n):
    for j in arange(m):
        Z[i,j] = f(X[i],Y[j])
X, Y = meshgrid(X, Y)
ax.plot_surface(Y, X, Z, rstride=1, cstride=1, cmap=cm.jet)
ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")
ax.set_zlabel("Z Axis")
plt.show()

运行正常并向我显示我正在寻找的图表。但是当我将##这行##改为hx = h / 2时。并运行它,图表下降到地狱,它是可怕的,不可能理解。我希望X中的网格比Y轴更近。我怎么能这样做?

当然这是我解决偏微分方程的一个例子,我需要在一个轴上比另一个轴更接近网格以具有数值可靠性。

1 个答案:

答案 0 :(得分:1)

您已翻转维度

Z = zeros([m,n])

for i in arange(n):
    for j in arange(m):
        Z[j,i] = f(X[i],Y[j])
X, Y = meshgrid(X, Y)

适用于nm之间的任何比率。

使用您拥有的功能,您可以使用numpy的广播并将整个部分写为

X, Y = meshgrid(X, Y)
Z = f(X,Y)

更容易阅读和更快。

我会将整个代码块重写为:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
from numpy import *

def f(x,y):
    r=x**2 + y**2
    return r


n = 5
m = 10
b = 1.
a = -b

fig = plt.figure()
ax = Axes3D(fig)
X = linspace(a,b,n)
Y = linspace(a,b,m)

X, Y = meshgrid(X, Y)
Z = f(X,Y)

ax.plot_surface(Y, X, Z, rstride=1, cstride=1, cmap=cm.jet)
ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")
ax.set_zlabel("Z Axis")
plt.show()