python环境下不规则网格上的曲面绘制

python环境下不规则网格上的曲面绘制,python,matplotlib,plot,Python,Matplotlib,Plot,是否可以创建函数的曲面图和等高线图,例如u(x,y)=x^2+y^2 关于方程有界的跟随域 r(t) = 1+(cos(4*t))^2, x = r(t)*cos(t),y = r(t)*sin(t), 0 < t < 2*pi 但结果并不像下面那样好 首先只需在矩形网格上计算函数 scipy.interpolate.griddata在凸面外壳上插值。你可以在书中读到。这意味着它也会在你的肺叶之间插值。这就是为什么你没有得到正确的域名。插值本身也不如仅计算网格上的函数精确 plot

是否可以创建函数的曲面图和等高线图,例如
u(x,y)=x^2+y^2

关于方程有界的跟随域

r(t) = 1+(cos(4*t))^2, x = r(t)*cos(t),y = r(t)*sin(t), 0 < t < 2*pi
但结果并不像下面那样好

首先只需在矩形网格上计算函数

scipy.interpolate.griddata
在凸面外壳上插值。你可以在书中读到。这意味着它也会在你的肺叶之间插值。这就是为什么你没有得到正确的域名。插值本身也不如仅计算网格上的函数精确

plot\u线框
需要一个您已经创建的矩形网格。您所需要做的就是计算矩形网格上的函数值。若要仅在域边界上绘制值,请将域边界以外的所有内容设置为
np.NaN
(非数字)

以下是如何做到这一点:

import matplotlib.pyplot as plt
import numpy as np

# cartesian coordinates
xx,yy = np.meshgrid(np.linspace(-2,2,100),np.linspace(-2,2,100))

# function value across square domain
Ua = xx**2 + yy**2

# polar coordinates
tt = np.arctan2(yy, xx)
rr = np.sqrt(Ua) # re-using x^2 + y^2 -- only works for this function

# r coordinate of domain boundary
domain_boundary = 1 + (np.cos(4*tt))**2

# function value across actual domain, with rest set to NaN
Ua[rr > domain_boundary] = np.NaN

# plotting
fig = plt.figure(2)
ax = fig.gca(projection='3d')
ax.plot_wireframe(xx,yy,Ua,rstride=1,cstride=1,linewidth=.5)


该解决方案并不完美,因为您可以识别结果中的矩形网格。您可以尝试在极坐标中工作,如所示。

您使用了什么代码创建第二个绘图?你想让它看起来像什么?@Joooey:我加了密码。正如我所说,我期望给定域的曲面图和等高线图。结果怎么了?它是否显示正确的域?看起来域可能已关闭。此外,如果您提供一个我可以直接复制到IDE中的文件,它将更容易找出哪里出了问题。例如,定义数据的代码在哪里?显示的是曲面图。您可以使用
等高线(xx,yy,Ua)
获得等高线图。我知道它是曲面图,但不正确。(见散点图)。实际上我的Ua一般没有x^2+y^2这样的公式。如果我的Ua不能被明确说明怎么办。此外,上述代码不适用于plot_曲面命令。1。如果Ua有不同的公式,您只需替换
rr=np.sqrt(xx**2+yy**2)
即可获得半径坐标。2.只要Ua是2D域上的一个函数,就应该有一种方法来显式地声明它(即从x和y值计算它)。如果它不是一个函数(即,如果一个xy对有两个z值),事情就会变得复杂。最好问一个新问题。
ax.plot\u surface
对我来说不会失败。域边界看起来非常粗糙。你必须花很多心思来制作你的网格,让它看起来很漂亮。您也可以尝试
ax.plot\u trisurf
(如您的问题的删除答案中所建议)。Trisurf将xx、yy和Ua作为一维阵列。
import matplotlib.pyplot as plt
import numpy as np

# cartesian coordinates
xx,yy = np.meshgrid(np.linspace(-2,2,100),np.linspace(-2,2,100))

# function value across square domain
Ua = xx**2 + yy**2

# polar coordinates
tt = np.arctan2(yy, xx)
rr = np.sqrt(Ua) # re-using x^2 + y^2 -- only works for this function

# r coordinate of domain boundary
domain_boundary = 1 + (np.cos(4*tt))**2

# function value across actual domain, with rest set to NaN
Ua[rr > domain_boundary] = np.NaN

# plotting
fig = plt.figure(2)
ax = fig.gca(projection='3d')
ax.plot_wireframe(xx,yy,Ua,rstride=1,cstride=1,linewidth=.5)