Python科学计算:多维绘图2

书上的代码有些问题,一直输出的是白的。啥都没有,我还在找原因,找到之后,会在评论区里面说的:

主要就是两个包:Axes3D、mayavi,但是,很奇妙的事情就是,跟着书上写的,你压根就没有东西输出出来,书上展示了两个文件,分别用Axes3D和mayavi的mlab绘图,但是,绘出的都是白色PDF,简称就是,啥都没有,就很离谱,虽然我已经把之前的全部给注释掉了,但是,Python为什么还会去执行已经注释掉的文件嘞?这俩个问题已经解决辽,在后面。

举例子:我的代码是

import numpy as np
xx,yy=np.mgrid[-2:2:81j,-3:3:91j]
zz=np.exp(-2*xx**2-yy**2)*np.cos(2*xx)*np.cos(3*yy)
from mayavi import mlab
fig=mlab.figure()
s=mlab.surf(xx,yy,zz,representation='wireframe')
ax=mlab.axes(line_width=2,nb_labels=0.4)
mlab.show()

但是,他的输出是我们上次课上讲的四面子图的绘制(这个问题已经解决了,python文件的路径有问题,改了就没事了):

图一:问题绘图

但是,在网上找的代码又是可以完全运行的,这让我不由得想起了一句话,完溜,被骗溜。。。

为什么嘞???代码基本上是一致的呀!!!

啊哈哈哈,我找到原因啦:

在这一行:

fig=plt.figure()
ax=fig.add_subplot(1,1,1, projection='3d')

上面的这种写法是正确的,你要是按照下面书上的这种写法,那根本输出不了:

fig=plt.figure()
ax=Axes3D(fig)

第二行代码要是和上面一样的话,你根本输出不了,这下看看我修改之后对的代码:

import numpy as np
[u,v]=np.mgrid[-1:2:51j,-2:2:61j]
x,y,z=u*(1-u**2/3+v**2),v*(1-v**2/3+u**2),u**2-v**2
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# plt.ion()
fig=plt.figure()
ax=fig.add_subplot(1,1,1, projection='3d')
ax.plot_surface(x.T,y.T,z.T,)#rstride=2,cstride=2,color='r',alpha=0.2,linewidth=0.5
ax.elev,ax.azim=50,-80
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
plt.show()

图二:修改之后的代码

import numpy as np
xx,yy=np.mgrid[-2:2:81j,-3:3:91j]
zz=np.exp(-2*xx**2-yy**2)*np.cos(2*xx)*np.cos(3*yy)
# # from mayavi import mlab
# # fig=mlab.figure()
# # s=mlab.surf(xx,yy,zz,representation='wireframe')
# # ax=mlab.axes(line_width=2,nb_labels=0.4)
# # mlab.show()
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# plt.ion()
fig=plt.figure()
ax=fig.add_subplot(1,1,1, projection='3d')
ax.plot_surface(xx,yy,zz,rstride=4,cstride=3,color='r',alpha=0.9)
ax.contour(xx,yy,zz,zdir='x',offset=-3.0,colors='black')
ax.contour(xx,yy,zz,zdir='y',offset=4.0,colors='blue')
ax.contour(xx,yy,zz,zdir='z',offset=-2.0)
ax.set_xlim3d(-3.0,2.0)
ax.set_ylim3d(-3.0,4.0)
ax.set_zlim3d(-2.0,1.0)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()

记住,如果用

plt.ion()
fig.show()

这两行代码的话,你的输出图像会一闪而过,很尴尬,当然,我之前的一篇博客里面也提到了一种解决方案,可以尝试着使用,来看看做出来的结果:

图三

图四

okok,解决了一个心头大患,再来解决mayavi:我现在严重怀疑我的mayavi'没有安装成功,重新试着安装一下看看:

。。。,mayavi安装失败。。。

图五:安装失败

cmd安装不成功,但是,powershell安装成功辽!!!

但是,不得不说,mayavi做出的图片就是漂亮。

安装很慢,待会再跟着书上的,用mlab可视化Enneper曲面:但是,还是不知道为什么,mayavi没法子启动,mayavi的安装,给大家推荐一个博客,很详实:mayavi安装的问题_linyanhao0104的博客-CSDN博客

这会先试着用mplot3D画一下居里叶集,书上使用mayavi画的,我觉着,我们可以试下mplot3d:

import numpy as np
x,y=np.ogrid[-1.5:0.5:1000j,-1.0:1.0:1000j]
z=x+1j*y
julia=np.zeros(z.shape)
c=-0.7-0.4j

for i in range(1,101):
    z=z**2+c
    escape=z*z.conj()>4
    julia+=(1/float(i))*escape

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig=plt.figure()
ax=fig.add_subplot(1,1,1, projection='3d')
ax.plot_surface(x,y,julia)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()

这是mplot3d输出的julia集的图像:

图六:julia集(1)

图七:julia集(2)

这是没有调色的结果,所以你看起来不太好看,我再试试看能不能用mayavi做出来,

啊哈哈,才发现是我的问题,,我的路径可能有问题,python一直在运行另外一个文件,就是前天绘图的那个,然后,我重新修改了一下,这下mayavi绘图完美,好漂亮啊:

图八:julia集(mlab版本(1))

图九:julia集(mlab版本2)

代码也很简单:

from mayavi import mlab
mlab.figure(size=(800,600))
mlab.surf(julia,colormap="gist_ncar",warp_scale='auto',vmax=1.5)
mlab.view(15,30,500,[-0.5,-0.5,2.0])
mlab.show()

解决了两个问题,今天收获满满啊,看来书上的只能说是借鉴,实际操作的时候,还得多看博客。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值