前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >matplotlib绘制三维曲面图时遇到的问题及解决方法

matplotlib绘制三维曲面图时遇到的问题及解决方法

原创
作者头像
华科云商小徐
发布2024-06-07 13:59:36
930
发布2024-06-07 13:59:36
举报
文章被收录于专栏:小徐学爬虫小徐学爬虫

在使用 Matplotlib 绘制三维曲面图时,可能会遇到一些常见的问题。今天我将全程详细讲解下遇到问题并且找到应对方法的全部过程,希望能帮助大家。

1、问题背景

在使用 matplotlib 绘制三维曲面图时,遇到了一个问题。代码如下:

代码语言:javascript
复制
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy
​
def H(n, f, l, delta, H_abs, H_ph):
    c0 = 2.99796e8
    n0 = 1.00027 + 0j
    n1 = complex(n[0], n[1])
​
    Sum = 0
    for i in range(1, delta+1):
        Sum = Sum + ((n0-n1)*exp(complex(0,-1*2*pi*f*n1*l/c0))/(n1+n0))**i
​
    H_Theo = 4*n0*n1*exp(complex(0,2*pi*f*l)*(n0-n1)/c0)*(1+Sum)/(n0+n1)
​
    M = abs(H_Theo) - H_abs
    A = cmath.phase(H_Theo) - H_ph
​
    return abs(M) + abs(A)
​
freq = 1213188709257.4814
l_real = 6.77e-4
d = 0
H_abs = 0.798653104536778
H_ph = 2.1845744701729926
​
n_test = numpy.arange(1.5, 2.5, 0.01).tolist()
k_test = numpy.arange(-0.05, 0.05, 0.001).tolist()
​
X = n_test
Y = k_test
X, Y = numpy.meshgrid(X, Y)
​
errore = []
for i in range(len(n_test)):
    errore.append(H([X[i],Y[i]], freq, l_real, d, H_abs, H_ph))
​
Z = errore
​
fig2 = plt.figure()
az = fig2.gca(projection='3d')
az.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3)
cset = az.contour(X, Y, Z, zdir='z', offset=min(Z)-1, cmap=cm.coolwarm)
cset = az.contour(X, Y, Z, zdir='x', offset=min(X)-1, cmap=cm.coolwarm)
cset = az.contour(X, Y, Z, zdir='y', offset=max(Y)+0.05, cmap=cm.coolwarm)
​
az.set_xlabel('n')
az.set_xlim(min(X)-1, max(X)+1)
az.set_ylabel('k')
az.set_ylim(min(Y)-0.05, max(Y)+0.05)
az.set_zlabel('Err')
az.set_zlim(min(Z)-1, max(Z)+1)
​
plt.show()

运行这段代码时,出现了如下错误:

代码语言:javascript
复制
n1 = complex(n[0], n[1])
TypeError: only length-1 arrays can be converted to Python scalars

2、解决方案

这个问题是由于在将 n 传递给 complex 函数时,n 是一个一维数组,而 complex 函数期望的是标量参数。为了解决这个问题,可以将 n 中的第一个元素和第二个元素分别作为实部和虚部传给 complex 函数,即:

代码语言:javascript
复制
n1 = complex(n[0], n[1])

修改后的代码如下:

代码语言:javascript
复制
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy
​
def H(n, f, l, delta, H_abs, H_ph):
    c0 = 2.99796e8
    n0 = 1.00027 + 0j
    n1 = n[0] + 1j * n[1]
​
    Sum = 0
    for i in range(1, delta+1):
        Sum = Sum + ((n0-n1)*numpy.exp(-1*2*numpy.pi*f*n1*l/c0)/(n1+n0))**i
​
    H_Theo = 4*n0*n1*numpy.exp(2*numpy.pi*f*l*(n0-n1)/c0)*(1+Sum)/(n0+n1)
​
    M = numpy.abs(H_Theo) - H_abs
    A = numpy.angle(H_Theo) - H_ph
​
    return abs(M) + abs(A)
​
freq = 1213188709257.4814
l_real = 6.77e-4
d = 0
H_abs = 0.798653104536778
H_ph = 2.1845744701729926
​
n_test = numpy.arange(1.5, 2.5, 0.01).tolist()
k_test = numpy.arange(-0.05, 0.05, 0.001).tolist()
​
X = n_test
Y = k_test
X, Y = numpy.meshgrid(X, Y)
​
errore = []
for i in range(len(n_test)):
    errore.append(H([X[i],Y[i]], freq, l_real, d, H_abs, H_ph))
​
Z = errore
​
fig2 = plt.figure()
az = fig2.gca(projection='3d')
az.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3)
cset = az.contour(X, Y, Z, zdir='z', offset=numpy.min(Z)-1, cmap=cm.coolwarm)
cset = az.contour(X, Y, Z, zdir='x', offset=numpy.min(X)-1, cmap=cm.coolwarm)
cset = az.contour(X, Y, Z, zdir='y', offset=numpy.max(Y)+0.05, cmap=cm.coolwarm)
​
az.set_xlabel('n')
az.set_xlim(numpy.min(X)-1, numpy.max(X)+1)
az.set_ylabel('k')
az.set_ylim(numpy.min(Y)-0.05, numpy.max(Y)+0.05)
az.set_zlabel('Err')
az.set_zlim(numpy.min(Z)-1, numpy.max(Z)+1)
​
plt.show()

现在,代码可以正常运行,并绘制出三维曲面图。

通过仔细检查并尝试解决上述问题,你应该能够成功绘制出所需的三维曲面图。如果问题仍然存在,可以考虑查阅 Matplotlib 官方文档或在相关的社区论坛上寻求帮助。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档