如何优雅地展示三维数据?

最近在astrobetter上有一篇文章:python3d-visualization-a-new-book-available-for-students-and-scientists,作者利用Blender做3维数据的可视化,优雅地展示了Blender的绚丽的效果。实际上,对3维观测数据的可视化在一些天文常用软件中就能实现,比如Starlink中的Gaia3D,SAO DS9 v7之后的版本,yt(Adam Ginsburg的例子),等等。

天文观测中经常有三维数据,例如积分视场光谱仪IFU的位置-位置-波长图像、椭圆星系的基本平面,等等。在射电观测中,最常见的3维数据就是位置-位置-速度的立方块(以下简称PPV数据)。可视化PPV数据的目的,除了看上去很好玩,有时候也有现实的意义,比如可以直观地看到恒星形成区中的双极外流、分子云中的速度梯度、开普勒旋转的盘结构、晚型星包层或者超新星遗迹的壳层结构等等。当然,PPV空间中的结构并不总是有实际的物理意义,速度轴上的分布也不总是代表视线方向上的距离,所以做出3维可视化虽然好玩,阐述它的时候要多加小心。

关于这种可视化,可以参考Alyssa Goodman教授的网站的介绍和他们发表在Nature上的文章中的十分优雅的可互动图像:

优雅的3维可视化图像,来自Goodman et al. 2009
可互动的3维可视化图像,来自Goodman et al. 2009的图2

前面提到的常用软件虽然适用性广,但是对于射电数据总有很多不方便。为了更方便地可视化射电观测得到的PPV数据,我利用Python中的astropy包读入数据,用Mayavi包实现可视化,另外用TraitUI做了一个简单的界面,制作了一个(比较)通用的工具,链接在此。它可以读入FITS格式的PPV数据(CASA输出的有额外的Stokes轴的数据也可以),并可以展示出3种图形:色阶按强度变化的散点;色阶按强度变化的3维等高面;色阶按速度变化的3维等高面。实际上,可以选取任意的数据作为色阶,比如让等高面的颜色对应气体温度,这在脚本里稍作修改即可。另外,还可以选择插入一副2维等高线图,比如毫米波连续谱发射的强度图。最后,界面中看到的场景可以存在一个3维模型文档中,并且可以输入到meshlab中,转换为u3d格式并插入LaTex文档,参见astrobetter上的教程。这样在LaTeX生成的文档中或者beamer制作的幻灯片中就可以有可互动的3维模型。另外,3维模型文档还可以上传到某些网站上,方便地插入到自己的网页里。下面就是我用这个脚本制作的一个3维模型,展示了一个红外暗云中的CO外流和毫米波连续谱发射。

CO outflows in G28.53 by xinglu on Sketchfab

以上是我的很不优雅的可视化方法,有很多不足之处,例如不认识银道坐标、在meshlab里的转化有些问题、在最新版本的Mayavi下也有些问题,等等。我会继续改进这个方法,同时作为抛砖引玉,希望大家不吝赐教,分享一下自己的可视化方法。

    分享到:

2 Replies to “如何优雅地展示三维数据?”

  1. gerry

    Chromium 43.0.2357.130 Linux

    Sketchfab的网页嵌入效果很棒!不过在文档嵌入交互对象的需求似乎并不强,而且Linux下似乎没有pdf阅读器能支持嵌入的3D对象

Leave a Reply

Your email address will not be published. Required fields are marked *