作为一个理工男,用过了形形色色可以用于科学作图/数据可视化软件:从大学时做实验课推荐用于分析简单采集数据的 Origin; 毕业论文时用来呈现实验时序信号和离线分析脑电信号的 MATLAB,后面还发现了 Octave 以及 Gnuplot ; 以及实验室师兄推荐用的 Matplotlib 软件; 工作后随着 HTML5 大红大紫,也发现了一些基于 Web 前端的软件,比如 d3js/Highcharts, 还有 Python 的 Bokeh…… 这些软件都有各自的优缺点,由于自己平时工作会做一些算法研究、数据展示,并且也觉得有我这样需求的人还有些。所以着手做启动了 WaaCaa 项目,主要基于这些需求:
- 基本作图与信息图:基本作图的支持不用说了:基于直角坐标系的散点图、折线图、柱状图,以及极坐标系的饼图、雷达图;另外还需要比较高级的信息图。用户只需要准备好输入数据,然后指定类型的图就呈现出来了;
- 良好的多语言接口支持:目前较为流行的,比如 MATLAB/Matplotlib/Highcharts, 但是他们都是语言绑定的,这样导致使用不同的工具,绘制/数据交互的风格/效果不一致;
- 良好的视觉效果和交互体验:良好的视觉效果和交互体验绝对不仅仅是使用者"赏心悦目"的需要,更是在做数据/算法研究时候便于理解数据的基本要求。举个例子,在一张图的数据被 clear 或者添加新数据后,如果有缓动(easing)/补间动画(animation)的时候,视口(view port)的缓慢变化会不会让用户更便于理解其中数据范围(range)的变化呢?——至少我是这么觉得的,没有animation的图上数据的范围(range)发生图片让人很不舒服;还有鼠标交互(包括拖拽平移、zoom in/out、滚轮支持);
- 高速绘制能力:由于我有做一些音频/音乐方面的算法研究,而新兴的基于 HTML5 的工具远远不能满足我做这方面研究的需求——在音频算法研究过程中,往往需要把时间划分到毫秒级别时间窗,如果要跟播放速度一致,那么往往就需要 10~100 Hz 的绘制频率了;
- 跨平台支持:虽然 Windows 用户很多,但是做科研的人也有不少 Mac OS X 用户(以及更少数的 Linux 桌面用户)。这款工具需要跨操作系统平台的支持,并且保持不同系统上的体验一致;
- 图片导出功能:把绘制好的图片导出成常用的交互格式,包括有压缩和没压缩的位图(bmp, png, jpg)以及矢量图(如 eps);
基于这些需求,我是这么做
技术选型的:
- 本作图软件作为一个 Server,提供 TCP Socket API,方便实现多语言接口支持;
- 包括窗口的用户交互和图形绘制、以及中间的逻辑用 C++ 编写,便于跨平台和高速绘制(选用C++11标准,为了更少的语言坑);
- 绘制方面,Windows 选用 Direct3D/Direct2D 方案,Mac OS X 以及 Linux X Window 选用 OpenGL 绘制;
从技术选型到现在,用零碎时间coding了两三个月了。目前 WaaCaa 还在完善中(仅完成了 Windows 版本,绘制基本图类型,只做了 C++ 用户接口)。工程已经发布到 github 。目前的效果图 https://github.com/ImplFancy/WaaCaa/blob/master/README.md
欢迎有志者联系我,一起完善它。后续会在本博客书写 WaaCaa 相关的技术文章。
WaaCaa 项目地址: https://github.com/ImplFancy/WaaCaa