Python和科学计算认证群组  - 讨论区

标题:关于Mayavi的问题

2011年04月19日 星期二 16:07

我需要绘制一幅三维曲面图,并且在曲面的下面绘制一系列的球体。

如果是分别绘制,都是没有问题的,但是如果并列写在一起

# -*- coding: utf-8 -*-

import numpy as np

from enthought.mayavi import mlab

x,y,z = np.loadtxt("aaa.txt").T

x.shape = y.shape = z.shape = 81, -1

mlab.surf(x, y, z, extent=(-1,1,-1,1,-0.5,0.5),representation="wireframe")

xp=np.array([400,1000,1400]).reshape(3,-1)

yp=np.array([400,1000,1400]).reshape(3,-1)

zp=np.array([500,500,500]).reshape(3,-1)

hp=np.array([180,180,180]).reshape(3,-1)

#mlab.points3d(xp,yp,zp,hp)

mlab.axes(ranges=(x.min(), x.max(), y.min(), y.max(), z.min(), z.max()))

mlab.show()

则会将两者分别显示在不同的sence中,

想请问大家,有没有办法让两者在同一个sence中显示?

或者有没有其他标准的做法?

2011年04月19日 星期二 17:57

extent=(-1,1,-1,1,-0.5,0.5)实际上将曲面的坐标范围变成了指定的范围,即:

x.min(), x.max() -> -1, 1

y.min(), y.max() -> -1, 1

z.min(), z.max() -> -0.5, 0.5

因此point3d需要在这个坐标系中绘图。

import numpy as np

 

from enthought.mayavi import mlab

x,y,z = np.loadtxt("data.txt").T

x.shape = y.shape = z.shape = 81, -1

surf = mlab.surf(x, y, z, extent=(-1,1,-1,1,-0.5,0.5))

mlab.axes(surf, ranges=(x.min(), x.max(), y.min(), y.max(), z.min(), z.max()))

xp=np.array([0,0.5,1.0])

yp=np.array([0,0.5,1.0])

zp=np.array([0.6,0.4,0.5])

 

mlab.points3d(xp,yp,zp, scale_factor=0.1)

 

mlab.show()

所以你需要把xp, yp, zp从实际的数据坐标系变换成这个坐标系。

我看你的zp数据和曲面数据不成比例,变换之后恐怕也显示不出来。

2011年04月19日 星期二 18:17

哦,我明白了

需要将点的坐标,换算到跟曲面的同一个坐标系中去。

不过我有一点困惑,

计算曲面时,只有x,y,z三组量

但是在绘点的时候,除了x,y,z之外,还有一组表示点的球体的的半径。

这一组值应该如何对应到前面的坐标系中去呢?

# -*- coding: utf-8 -*-

import numpy as np

from enthought.mayavi import mlab

x,y,z = np.loadtxt("aaa.txt").T

z=z*0.0001

print z

x.shape = y.shape = z.shape = 81, -1

surf=mlab.surf(x, y, z, extent=(-1,1,-1,1,-0.5,0.5),representation="wireframe", line_width=1.0)

xp=np.array([-0.5,0,0.5]).reshape(3,-1)

yp=np.array([-0.5,0,0.5]).reshape(3,-1)

zp=np.array([-0.3,-0.3,-0.3]).reshape(3,-1)

hp=np.array([180,180,180]).reshape(3,-1)#????

 

mlab.points3d(xp,yp,zp,hp)

mlab.axes(surf,ranges=(x.min(), x.max(), y.min(), y.max(), z.min(), z.max()))

mlab.show()

2011年04月19日 星期二 19:02

单独使用points3d函数时,传入第四列值时,将表示球体的大小。

但是像上面这样书写代码却不能生效,

不知道是哪个步骤除了错。

2011年04月19日 星期二 21:45

hp=np.array([180,180,180]).reshape(3,-1)   180太大了,你看不到了,视野在球里边

hp=np.array([1,1,1]).reshape(3,-1)

mlab.points3d(xp,yp,zp,hp,colormap="copper", scale_factor=.25)

2011年04月19日 星期二 22:27

我尝试将球体的大小减小了,果然能够正常看见了。

不过我有一点疑惑,

球体的大小,也就是第四个list

他是如何跟surf的坐标对应的呢?

对应的是哪个轴的比例呢?

2011年04月20日 星期三 08:48

你前边定义的坐标0.几何180数量级相差太大,MAYAVI要先显示坐标轴,所以下边的就可以看到

xp=np.array([-50,0,50]).reshape(3,-1)

yp=np.array([-50,0,50]).reshape(3,-1)

zp=np.array([-30,-30,-30]).reshape(3,-1)

hp=np.array([180,180,180]).reshape(3,-1)

mlab.points3d(xp,yp,zp,hp,colormap="copper", scale_factor=.25)

但是这样就看不到了

xp=np.array([-50,0,50]).reshape(3,-1)

yp=np.array([-50,0,50]).reshape(3,-1)

zp=np.array([-30,-30,-30]).reshape(3,-1)

hp=np.array([0.180,0.180,0.180]).reshape(3,-1)

 

定义点的坐标优先,我是这样理解的

2011年04月20日 星期三 10:30

单独运行的时候,确实是这样的。

我提供的X,Y,Z坐标是有点小。

不过小的原因是因为,从外部导入的用于显示三维曲面的数值比较大,即从文本中导入的值

因此在

surf=mlab.surf(x, y, z, extent=(-1,1,-1,1,-0.5,0.5),representation="wireframe", 

中使用了extent参数,对坐标轴进行了比例换算。

实际上

xp=np.array([-0.5,0,0.5]).reshape(3,-1)

yp=np.array([-0.5,0,0.5]).reshape(3,-1)

zp=np.array([-0.3,-0.3,-0.3]).reshape(3,-1)

三组数据,对应的原始数据是

[160,320,480]

[160,320,480]

[-100,-100,100]

只是按照比例换extent=(-1,1,-1,1,-0.5,0.5)

算为了上述的浮点型值。

但是坐标换算只有三组,包括X,Y,Z坐标

所以对于用于表示球体的大小这组值,应该怎么换算有点不解·~

 

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号