python曲面图_python环境中不规则网格上的曲面图

是否可以创建函数的曲面图和等高线图,例如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 griddata如下

from matplotlib.pyplot import *

import numpy as np

from mpl_toolkits.mplot3d import Axes3D

from scipy.interpolate import griddata

data = np.array([[ 2.00000000e+00, 0.00000000e+00],

[ 1.89614525e+00, 1.51126793e-01],

[ 1.62613327e+00, 2.60869688e-01],

[ 1.29639187e+00, 3.15328472e-01],

[ 1.03183519e+00, 3.39805963e-01],

[ 9.22330309e-01, 3.87424263e-01],

[ 9.85968247e-01, 5.09806830e-01],

[ 1.16496791e+00, 7.25092951e-01],

[ 1.35481653e+00, 1.00089121e+00],

[ 1.45215333e+00, 1.26290100e+00],

[ 1.39897768e+00, 1.42707450e+00],

[ 1.20351374e+00, 1.44074409e+00],

[ 9.29854857e-01, 1.31248166e+00],

[ 6.63453200e-01, 1.11474417e+00],

[ 4.70396020e-01, 9.55864325e-01],

[ 3.70174853e-01, 9.32786757e-01],

[ 3.33831717e-01, 1.08590518e+00],

[ 3.06157327e-01, 1.37738581e+00],

[ 2.38732323e-01, 1.70413196e+00],

[ 1.15900227e-01, 1.94068353e+00],

[-3.96388724e-02, 1.99329358e+00],

[-1.83621616e-01, 1.84088591e+00],

[-2.79344160e-01, 1.54430632e+00],

[-3.22477316e-01, 1.21965478e+00],

[-3.47231849e-01, 9.87829012e-01],

[-4.09520279e-01, 9.23088740e-01],

[-5.55288737e-01, 1.02352335e+00],

[-7.90735832e-01, 1.21586141e+00],

[-1.07111976e+00, 1.39113164e+00],

[-1.31601256e+00, 1.45381050e+00],

[-1.44544698e+00, 1.36169834e+00],

[-1.42013085e+00, 1.13913085e+00],

[-1.26561597e+00, 8.59376173e-01],

[-1.06700598e+00, 6.06642746e-01],

[-9.34540362e-01, 4.37040778e-01],

[-9.54661396e-01, 3.57053472e-01],

[-1.14896223e+00, 3.28361061e-01],

[-1.46070082e+00, 2.94327457e-01],

[-1.77632959e+00, 2.12929020e-01],

[-1.97334870e+00, 7.85155418e-02],

[-1.97334870e+00, -7.85155418e-02],

[-1.77632959e+00, -2.12929020e-01],

[-1.46070082e+00, -2.94327457e-01],

[-1.14896223e+00, -3.28361061e-01],

[-9.54661396e-01, -3.57053472e-01],

[-9.34540362e-01, -4.37040778e-01],

[-1.06700598e+00, -6.06642746e-01],

[-1.26561597e+00, -8.59376173e-01],

[-1.42013085e+00, -1.13913085e+00],

[-1.44544698e+00, -1.36169834e+00],

[-1.31601256e+00, -1.45381050e+00],

[-1.07111976e+00, -1.39113164e+00],

[-7.90735832e-01, -1.21586141e+00],

[-5.55288737e-01, -1.02352335e+00],

[-4.09520279e-01, -9.23088740e-01],

[-3.47231849e-01, -9.87829012e-01],

[-3.22477316e-01, -1.21965478e+00],

[-2.79344160e-01, -1.54430632e+00],

[-1.83621616e-01, -1.84088591e+00],

[-3.96388724e-02, -1.99329358e+00],

[ 1.15900227e-01, -1.94068353e+00],

[ 2.38732323e-01, -1.70413196e+00],

[ 3.06157327e-01, -1.37738581e+00],

[ 3.33831717e-01, -1.08590518e+00],

[ 3.70174853e-01, -9.32786757e-01],

[ 4.70396020e-01, -9.55864325e-01],

[ 6.63453200e-01, -1.11474417e+00],

[ 9.29854857e-01, -1.31248166e+00],

[ 1.20351374e+00, -1.44074409e+00],

[ 1.39897768e+00, -1.42707450e+00],

[ 1.45215333e+00, -1.26290100e+00],

[ 1.35481653e+00, -1.00089121e+00],

[ 1.16496791e+00, -7.25092951e-01],

[ 9.85968247e-01, -5.09806830e-01],

[ 9.22330309e-01, -3.87424263e-01],

[ 1.03183519e+00, -3.39805963e-01],

[ 1.29639187e+00, -3.15328472e-01],

[ 1.62613327e+00, -2.60869688e-01],

[ 1.89614525e+00, -1.51126793e-01],

[ 2.00000000e+00, -4.89858720e-16],

[ 0.00000000e+00, -1.50000000e+00],

[-1.00000000e+00, -1.00000000e+00],

[ 0.00000000e+00, -1.00000000e+00],

[ 1.00000000e+00, -1.00000000e+00],

[-5.00000000e-01, -5.00000000e-01],

[ 0.00000000e+00, -5.00000000e-01],

[ 5.00000000e-01, -5.00000000e-01],

[-1.50000000e+00, 0.00000000e+00],

[-1.00000000e+00, 0.00000000e+00],

[-5.00000000e-01, 0.00000000e+00],

[ 0.00000000e+00, 0.00000000e+00],

[ 5.00000000e-01, 0.00000000e+00],

[ 1.00000000e+00, 0.00000000e+00],

[ 1.50000000e+00, 0.00000000e+00],

[ 2.00000000e+00, 0.00000000e+00],

[-5.00000000e-01, 5.00000000e-01],

[ 0.00000000e+00, 5.00000000e-01],

[ 5.00000000e-01, 5.00000000e-01],

[-1.00000000e+00, 1.00000000e+00],

[ 0.00000000e+00, 1.00000000e+00],

[ 1.00000000e+00, 1.00000000e+00],

[ 0.00000000e+00, 1.50000000e+00]])

ua = data[:,0]**2+data[:,1]**2 # u=x^2+y^2

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

Ua = griddata((data[:,0],data[:,1]),ua,(xx,yy),method='cubic')

fig = figure(1)

plot (data[:,0], data[:,1], '*'); #

fig = figure(2)

ax = fig.gca(projection='3d')

ax.plot_wireframe(xx,yy,Ua,rstride=1,cstride=1,linewidth=.5)

但结果不如下

最佳答案 首先只计算矩形网格上的函数!

scipy.interpolate.griddata在凸包上插值.您可以在the docs中读取它.这意味着它也会在您的波瓣之间进行插值.这就是为什么你没有得到正确的域名.插值本质上也不如仅仅计算网格中的函数那么准确.

plot_wireframe想要一个你已经创建的矩形网格.您需要做的就是计算矩形网格上的函数值.要仅绘制域边界上的值,请将其外部的所有值设置为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)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值