Igor Pro实用教程:图表绘制、数据分析与程序设计
上QQ阅读APP看书,第一时间看更新

2.5.2 三维图形的绘制

绘制3D图的方法并不复杂。以绘制曲面为例,首先创建一个二维矩阵

      Make/O/N=(100,100)data
       SetScale/I x, -pi, pi, data
       SetScale/I x, -pi, pi, data
      data=sin(x)∗cos(y)

执行菜单命令【Windows】|【New】|【3 D Plots】|【Surface Plots】,打开3 D图形绘制对话框,如图2-89所示,其各项的含义与第2.4.7节介绍的相同。【Source】选择源数据的类型,这里选择Matrix wave。【Surface】下拉列表框选择要使用的原始数据,这里选择刚创建的data。【Surface Color】表示曲面的颜色,这里默认选择Rainbow,曲面的颜色由data矩阵中的数值大小决定,如果要修改,可以单击【Details】按钮。其他的选项选择默认设置。

图2-89 3D图形绘制对话框

单击【OK】按钮后结果如图2-90所示。左侧为显示3D图的Graph窗口,右侧为3D图绘制信息对话框。

图2-90 3D图及其绘制信息对话框

图2-90左侧的3D图可以自由旋转,按下并移动左键即可拖动视图。

【Gizmo Info】面板显示当前3D图的基本信息,如本例中3D图包含一个曲面surface0和一个坐标系axes0,这两个对象分别显示在【Gizmo Info】面板中【Display List】和【Obj ect List】属性列表中。surface0是3D图的名字。双击Surface0会弹出前面的Surface创建对话框,可以对Surface进行设置,如设置颜色、显示网格等。

【Gizmo Info】是3 D图形绘制的主要操作面板。除了通过菜单命令绘制3 D图之外,也可以通过【Gizmo Info】绘制3D图形,方法是单击【Object List】下三角形,选择【Append New Object】,然后选择要绘制的3D图形。根据选择类型不同会打开相应的对话框。

【Obj ect List】中的对象并不会显示,只有将【Obj ect List】列表中的对象拖入【Display List】才可以显示。Axes也是一个对象,表示坐标轴。

除了3D图对象、坐标轴对象之外,【Object List】列表还包括一些标准图形对象,如线、三角形、空间四边形、球体、柱体等,这些标准图形对象除了绘制特殊形状之外,也可以用来表示散点图或者空间图中的数据marker。注意,标准图形使用绘图区域相对坐标,绘图区域范围被定义为(-1,1),因此这些对象的坐标值应该小于这个数值。

除了基本的3D图形对象之外,【Display List】列表还包括对图像的操作,如图像变换、视角、颜色等对象。【Attribute List】列表列出属性对象,属性对象描述了3D图形的某些属性,如颜色、线宽、光照、光泽等。这些属性可以直接拖入【Display List】显示列表或者【Obj ect List】相应对象中,作为该对象属性之一,这些属性会影响3 D图形的最终显示效果。

【Gizmo Info】窗口可以通过NewGizmo/I命令打开。

特别地,在创建曲面时,数据源的类型一共包括9种,理解这些数据类型对掌握3D绘图非常有益,现将其含义介绍如下:

(1)Matrix wave:源数据是一个二维矩阵。

(2)Triangles wave:源数据是一个N×3的wave,每一行存放一组(x, y, z)坐标,每相邻三行表示一个三角形的3个顶点,曲面由这些三角形组成。在绘制等高面时,使用ModifyGizmo命令的savetowave属性可以生成等高面对应的Triangles wave。

(3)Volume wave:源数据是一个三维矩阵,此时曲面来源于源数据 z 方向的一层(plane)。

(4)Parametric wave:源数据是一个M×N×3的三维矩阵,按层存放xyz坐标。

(5)Quad wave:源数据是一个N×4×3的三维矩阵,表示曲面由一系列空间四边形组成,每一行的4列分别存放四边形的4个顶点,三层分别对应xyz坐标。

(6)Disj oint Qud wave:源数据是一个N× 12的二维矩阵,每一行存放一个空间四边形的4个顶点坐标。

(7)Volume Z Plane:源数据是一个三维矩阵,此时曲面数据来源于 z方向的一层(plane)。

(8)Volume X Plane和Volume Y Plane:和Volume Z Plane含义相同,只是曲面数据来源于x方向或者y 方向。

下面通过参数曲面创建一个球面。球面的参数方程如下:

创建参数曲面源数据的代码如下:

      Make/O/N=(20,20,3)dsphere
       SetScale/I x,0, pi, dsphere
        SetScale/I y,0,2∗pi, dsphere
        dsphere[][][0]=1∗sin(x)∗cos(y)
        dsphere[][][1]=1∗sin(x)∗sin(y)
        dsphere[][][2]=1∗cos(x)

绘制曲面的代码如下,效果如图2-91所示。

        NewGizmo/N=Gizmo0/T="Gizmo0"
        ModifyGizmo startRecMacro
        AppendToGizmo Surface=root:dsphere, name=surface0
        ModifyGizmo ModifyObj ect=surface0 property={surfaceColorType,1}
        ModifyGizmoModifyObject=surface0 property={fillMode,3}
        ModifyGizmo ModifyObj ect=surface0 property={srcMode,4}
        ModifyGizmoModifyObject=surface0 property={frontColor,0.250004,0.996109,0.250004,1}
        ModifyGizmoModifyObject=surface0 property={backColor,0.996109,0.664073,0,1}
        ModifyGizmo setDisplayList=0, object=surface0
        ModifyGizmo SETQUATERNION={0.488416,0.302182,0.455614,0.680110}

图2-91球形曲面绘制

读者也可以通过菜单来创建,但注意如果当前数据文件夹下仅有dsphere(即刚创建的数据)时,【Surface】菜单项不可用。此时可选择【Others】打开【Gizmo Info】面板,通过向【Obj ect List】添加【Surface】对象来创建上述曲面。同样,在命令行窗口输入NewGizmo/I也可以实现相同的操作。这里的操作留给读者作为练习。

在创建其他类型的3D图形时,数据类型已经确定,不能选择,如创建散点图,对话框只列出N×3的数据,看下面的例子:

      Make/O/N=(20,3)data=gnoise(5)
      data[][2]=2∗data[p][0]-3∗data[p][1]+data[p][0]2+gnoise(0.05)

执行菜单命令【Window】|【New】|【3D Plot】|【Scatter Plot】,打开散点图绘制对话框,如图2-92所示。

图2-92 散点图绘制对话框

散点图绘制对话框只列出满足条件的数据,如刚创建的data。【Marker Shape】里可以选择每一个散点对应的图形标记,如球体、立方体等。这些形状都是Igor预定义好的一些标准3D图形。还可以设置相应形状的颜色、旋转角度和大小等。

Voxelgram用于绘制真正的三维数据,这里的三维数据有3个坐标xyz,每一个数据点表示坐标为(x, y, z)处的数值。绘制时需要给数据点指定一个基本形状,或者将数据点显示为一个点。同时还要指定数值取某个值时数据点对应的颜色,Igor最多支持5个不同的颜色。

文献里经常会看到如图2-93所示类型的3D图,这里举例说明利用Igor绘制该类型图的方法(下面的方法适用于Igor 6.37及以前部分版本)。

图2-93 带有投影平面的3D图

首先创建一个wave:

      Make/N=(100,100)/O data
       SetScale/I x, -2,2, data
       SetScale/I y, -2,2, data
      data=gauss(x, -1,0.5, y, -1,0.5)+gauss(x, -1,0.5,
      y,1,0.5)
      data=data+gauss(x,1,0.5, y, -1,0.5)+gauss(x,1,
       0.5, y,1,0.5)

上述代码创建了名为data的wave,用于模拟类似电子态密度的分布。执行菜单命令【Windows】|【New】|【3D Plots】|【Surface Plot】,打开3D图形绘制对话框,按照图2-94设置。

图2-94 3D图形绘制对话框的设置

在【Surface】里选择data,然后按【OK】按钮,得到图2-95。

图2-95 3D Surface(曲面)图

图2-95也可以在数据浏览器中直接右击data,在弹出的快捷菜单里选择【Gizmo Plot】绘制。

使图2-95处于选择状态,执行【Gizmo】|【Axis Range】菜单命令,在弹出的对话框里设置坐标轴范围。这里设置z的最小值为-1,其他保持不变,此时数据显示在坐标系z方向靠上的部分,如图2-96所示。

图2-96 设置3D图的坐标范围

图的颜色不太正常,是由于颜色表默认第一个颜色对应刚设置的-1这个数值。将它改成正确的值就可以了,这里可设为0。双击图2-96的绘图区域(或者在【Gizmo Info】中双击surface0),在弹出的外观设置对话框里,单击【Surface Color】里【Detail】按钮,在弹出的对话框里设置选中【First Color at】复选框,并将其值设为0,如图2-97所示,显示效果如图2-98所示。

图2-97 3D图颜色方案设置

图2-98 修改颜色后的3D图

执行菜单命令【Gizmo】|【Append Contours】,打开如图2-99所示的对话框,按图设置,然后单击【Append Contour】按钮,给曲面添加Contour投影平面。

图2-99 给3D图添加Contour投影平面

关闭刚打开的对话框【Gizmo Contours】,在【Gizmo Info】窗口中,双击axes0对象,在弹出的对话框里设置X0、Y0和Z0坐标信息分别为Momentum、Momentum、Density, X0和Y0的【Center】值设置为-0.5, Z0的【Tilt】值设置为-90,注意一定要选中【Draw Axis Label】复选框,如图2-100所示。

图2-100 3D图坐标轴标签设置

最终效果就是本文前面提到的图2-93。利用同样的办法也可以将Contour换成Image,方法完全一样。

当一个3 D图形处于当前选择状态时,菜单栏里会出现一个【Gizmo】菜单。【Gizmo】菜单包含一些对3D图形操作的基本命令,如向当前窗口添加新的3D图、设置坐标轴范围等。【Gizmo】菜单里有一个【3D Slicer】的菜单项,可以打开一个简单的3D数据处理面板,通过此面板可以向当前窗口添加一个切面Image, Image可以是垂直x方向切取,也可以是垂直y方向或者z 方向切取,并且能自由拖动面板上滑块以显示不同的位置的切面。面板上各功能按钮描述得非常清楚,使用起来非常方便前面的曲面二维投影和3D Slicer并非Igor的内置功能。在6.37及以前版本中该功能其实是通过Igor附带的程序包实现的,属于Igor编程内容。在新版本中(Igor Pro7)这部分功能被移出Gizmo菜单。读者如果需要只要包含对应的程序文件即可。Inclucle All Gixzma Procedures就可以包含此程序。

和其他的对话框一样,这里所有的操作也都最终被转化为相应的命令行。读者可以先利用菜单及对话框创建好相应的3D图,然后按Ctrl+Y键保存自动生成脚本(Recreation Macro)察看这些命令行。熟练以后,可以直接使用命令行创建3D图形。

通过执行菜单命令【Windows】|【New】|【3D Plots】|【3D Help】可以打开3D图绘制的帮助文件,里面有对Igor下3D图形绘制及其机理的详细介绍。通过执行菜单命令【Gizmo】|【Gizmo Help】也可以打开同样的帮助文件。3D图形绘制主要有7个命令和1个函数:AppendToGizmo、ExportGizmo、GetGizmo、GizmoMenu、ModifyGizmo、NewGizmo、RemoveFromGizmo、GizmoInfo。通过查询这些命令及函数的使用帮助也可以获取3D图形的帮助信息及其使用和设置方法。在命令行输入DisplayHelpTopic“Gizmo Reference”可以打开这些命令的帮助文档。

3D图形的绘制和显示还涉及其他一些概念,如坐标系统、投影、视角、变换、环境、光线、阴影、透明度、材质等,Igor支持这些特性,但使用起来较为复杂,完全掌握这些设置技巧需要对OpenGL 3D图形显示有较为深刻的理解。