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 © 2024
京ICP备05028076号