LWN:Gnuplot 5.4中的新功能!

关注了就能看到更多这么棒的文章哦~

New features in gnuplot 5.4

July 22, 2020
This article was contributed by Lee Phillips
https://lwn.net/Articles/826456/
DeepL assisted translation

Gnuplot 5.4 终于发布了,这是自由软件中著名的 graphing 程序,它的上一个主要版本已经是三年前的事情了。在本文中,我们将介绍一下 gnuplot 的五大新功能。首先,我们简单地参观一下可视化 3D 数据的 voxel plotting。由于这是一个很大的课题,也是 Gnuplot 新增功能中最重要的一点,细节会在后续文章中介绍。接下来,我们将学习如何在 3D 中绘制多边形(polygons),这是它的另一个全新功能。之后我们将简单地了解蜘蛛图(spider plots),用它们来展示近期的 COVID-19 感染数据。然后我们将看到一个使用 pixmaps 的例子,这是一个允许在曲线(curves)或曲面(surfaces)旁嵌入图片的新功能。最后,我们将使用新的 3D 条形图查看更多的 COVID-19 数据。

5.4 中所有改进和 bug fix 的完整说明可以在 release notes 中找到。LWN 在 2017 年 5 月有一篇文章,介绍了当时即将发布的 gnuplot 5.2 版本,其中描述了它当时的新功能,其中一些功能在 5.4 中得到了扩展。

Gnuplot's staying power

Gnuplot 是自由软件早期的一个成功例子。它是第一个被广泛使用的开源绘图工具,并成为人们用 Fortran 来模拟海洋和原子弹等的首选工具。作为一个独立的、编译好的 C 程序,它一直是 technical graphing 领域的主力军,经久不衰,这在主要是由于它在面对巨大数据集时表现出来的速度和稳定性。

通常来说使用 gnuplot 的控制界面是终端上的交互式提示符界面,也可以通过执行它特有的脚本语言。Gnuplot 的主要优势是为科学领域或其他一些技术出版物中来创建图示,以及对来自传感器、simulation 或服务器统计数据的这些数据流进行实时图形化显示。

Gnuplot 不依赖具体语言的,这一点与那些针对特定编程语言实现的软件库是不同的。有些人认为必须新学习 gnuplot 脚本语言,这个不是很友好,但是根据我的经验,这并不比学习由绘图库(plotting library)接口定义的那些特定语言中的接口更麻烦。Gnuplot 可以通过 socket 来控制,并且可以从 pipe 或 FIFO 中获取数据来进行绘制。这样使得它可以很容易地地与任何编程语言配合起来使用。为了能让它更加易用,针对大多数流行的语言都实现了 gnuplot 接口,Julia 的 Gaston 或 Python 的 Gnuplot.py 都是很好的例子。

gnuplot 受科学家欢迎的一个主要因素是它与 TeX 和 LaTeX 可以很好地配合使用。这样就可以自动创建带有同样的印刷字体的图示和文本。Gnuplot 具有广泛的可定制性,在让简单的事情变得简单的同时,也让复杂的事情变得容易处理,比如通过对齐一组图形来创建复合插图,或者在曲面中嵌入一个矢量场这样玄乎的事情(但你仍然无法制作一个饼图——得利用一些技巧)。最后,gnuplot 可以针对各种输出设备来产生这种输出,或者在 Jupyter 笔记本上使用 gnuplot 内核来输出。

Voxel plots

gnuplot 5.4 中最突出的新功能是 voxel plotting。图像(比如一张照片)是由一个二维像素阵列组成的,这个概念大家应该都很熟悉了。每个像素(pixel)都有一个 x、y 坐标和一种颜色。将像素的概念延伸到第三维,就是 voxel,其实这个词是 "体积像素(volume pixel) "的简称。

但 voxel 跟我们要谈的对函数和数据进行可视化这个话题有什么关系吗?

到目前为止,gnuplot 中所有的绘图类型都是包含一个或两个变量的函数。在两个变量的情况下,我们可以选择曲面(surfaces)、等高线(contour)或图像图(image plots,有时也称为热力图 "heat map")。当然,在 gnuplot 能有个全息输出方式之前,我们仍然只能受限于屏幕或纸张的表面,所以最终的结果将是 3D 数据或函数的透视渲染。

Voxel 数据集在医学成像中很常用,它们被用来显示 MRI 或 CAT 扫描的结果,在工程或物理学中,它们有助于理解诸如螺旋桨周围的 3D flow pattern(流动模式)。Gnuplot 提供了各种各样的技术来绘制 voxel 数据。

在今后的文章中,我们将通过各种例子来深入探讨这些技术。现在我们只显示一个 voxel plot 的示例,这是来自物理学的一个例子:由偶极子而产生的电势场("电压"),这是两个固定在原地的相反电荷。这个模型可以用来解释当观察者非常远的情况下的水分子模型。

如果将这两个电荷放在 z 轴上,它们就会产生下图中展示的三维电势场。

[一个偶极场]

在后续文章中,我们将看到还可以用其他各种方法来对相同的一组数据进行可视化展示。创建该图的完整脚本可以在附录中获取(https://lwn.net/Articles/826558/#voxel-script )。

Polygons

在 gnuplot 5.4 中,spot 命令有了新的功能:现在可以在 3D 空间中绘制封闭的 2D 多边形集。它可以通过两种方式来产生不同的效果。

第一种方式是使用新的命令绘制定义多边形集的顶点位置列表。

splot <$vertices> with polygons

这种方法中所有多边形的颜色都是相同的,因此需要不同的透明度或光照度来进行渲染区分。

第二种方法更灵活,因为它允许对每个多边形使用不同的颜色和透明度。这种方法使用了 gnuplot 的新的 polygon object type。我们定义了一组 object 的列表,而不是一组坐标值。这六个 polygon object 被排列成一个盒子的形状不过有一边是倾斜的。

set style fill transparent solid 0.8
set obj 1 polygon from 0,0,0 to 1,0,0 to 1,1,0 to 0,1,0 to 0,0,0\
depthorder fillcolor "blue"
set obj 2 polygon from 0,0,0 to 0,0,1 to 1,0,1 to 1,0,0 to 0,0,0\
depthorder fillcolor "#AAAA00"
set obj 3 polygon from 1,0,0 to 1,1,0 to 1,1,1 to 1,0,1 to 1,0,0\
depthorder fillcolor "#33AAAA"
set obj 4 polygon from 0,0,0 to 0,1,0 to 0,1,1 to 0,0,1 to 0,0,0\
depthorder fillcolor "#CC0066"
set obj 5 polygon from 0,1,0 to 0,1,1 to 1,1,1 to 1,1,0 to 0,1,0\
depthorder fillcolor "#33FF66"
set obj 6 polygon from 0,0,1 to 0,1,1 to 1,1,1.5 to 1,0,1.5 to 0,0,1\
depthorder fillcolor "#AAAAAA"

第一行是告诉 gnuplot ,这个 object 的不透明度为 0.8 的纯色,也就是略微透明。在随后的 set object 命令中, depthorder 保证了多边形中离 "人眼 "较远的部分会先于较近的部分绘制,这样渲染出来的效果才会正确。每个命令还定义了这个矩形的顶点及其颜色。

定义好这些对象后,就可以使用任意的 splot 命令展示出来,直到它们的定义被清除掉为止。gnuplot 有比较让人难于理解的一点,没有办法直接绘制多边形或任何其他对象。它们是要和曲线或曲面一起绘制的。所以在这样的情况下,如果我们真的只想要多边形,而没有曲面可以绘制,我们就必须使用 splot 命令,这样实际上并没有绘制 surface。有一种方法是绘制一个完全位于坐标系范围之外的 surface。

splot -1

这将产生下图。

[一个透明的盒子]

Spider plots

蜘蛛图(spider plot,也被称为雷达图 radar chart)是 gnuplot 中另一个新增的图形类型。蜘蛛图的目的是为了可视化多变量数据,所以它们有好几个轴,每个轴代表了一个独立变量。在这个意义上来说,它们类似于平行轴图(parallel axis plots),平行轴图在 gnuplot 5.2 中首次出现,并在我们之前的文章中有介绍。不同点在于,在蜘蛛图中所有的轴都交汇在一个共同点上,并不是平行的。虽然蜘蛛图的使用在某些方面存在争议,但它们可以创建有趣的图示,并且是构建某些类型图表的简单方法。

那些在 gnuplot 中使用过平行轴图的人都需要注意一下,本版本开始语法有了变化,现有的脚本得要修改后才能使用了,这一点比较遗憾。

为了说明蜘蛛图可以应用在什么场景,我下载了一些近期的 COVID-19 数据,并提取了 6 月 12 日和 7 月 12 日六个国家的确诊病例率的数字,将数据这样排列。

Italy, United States, Honduras, France, Canada, Switzerland 3905.638, 6112.782, 774.286, 2383.218, 2583.822, 3577.396 4016.203, 9811.656, 2784.865, 2615.946, 2843.902, 3779.832

这些数字是在两个日期中,每百万人中的阳性病例数量。下面是一个完整脚本,可以产生下面的图表(为了方便解释,增加了行号):

(1) set title "COVID cases per million, 12Jun and 12Jul 2020\n" font "Times,16"
(2) set spiderplot
(3) set datafile separator comma
(4) set for [p=1:6] paxis p range [0:10000]
(5) set for [p=1:6] paxis p tics format ""
(6) set paxis 4 tics 2000 font ",8" format "%g"
(7) set style spiderplot fillstyle transparent solid 0.3 border\
        linewidth 1 pointtype 6 pointsize 1.2
(8) set grid spider linetype -1 linecolor "grey" lw 1
(9) plot for [i=1:6] "spidey.dat" using i title columnhead

第(2)行是制作蜘蛛图的必要命令。第(3)行表示数据用逗号分隔。接下来的两行设置了六个轴,以及它们的范围和 tic 格式。我们只想在其中一个轴上显示数字,在第(6)行指明这个要求。第(7)行使数据形成的多边形的填充样式为纯色、透明色,用边框限定它们的边界,并要求点尺寸为 1.2 的开放圆(pointtype 6)。第(8)行画了网格,这是一组灰色的线条,有点像蜘蛛网的感觉;linetype -1 是一条实线。最后一行是把 plot 展示出来。

这个循环结构(for [i=1:6])是平行轴或蜘蛛图所需要用到的。数据文件名为 "spidey.dat ",存储在磁盘上,这个循环与的意思是在每一行的六个数字中循环,从每一行创建一个新的多边形。如果我们想跳过一些数字,我们可以在这里改变循环。"title columnhead"这几个字说的是取文件的第一行来作为 axis labels(轴标签)

[spiderplot] 在图中,6月 12 日的数据用紫色显示,绿色区域显示一个月后的数据。人们可以立即看到,其中四个国家的病例数增长非常小,而美国和洪都拉斯的增长速度要快得多。该图清楚地表明,美国的确诊病例比例要比其他国家大得多。

Pixmaps

在 gnuplot 5.4 中的新增了一个概念——pixmap,是一个放置在二维或三维绘图空间中固定位置的 image object。Pixmap 可以用于显示 logo、背景图片,或者作为说明性的 label 放在 curve 或者 surface 上的特定位置。

假设一位行星科学家有一个太阳系中行星的某些属性的模型,由包含两个变量的函数 f()描述。f()的图是一个 surface。用这些位置所对应的行星的图片来标注这个曲面上的各个位置会很有帮助。这就可以使用 pixmaps 来实现。如果在磁盘上有一个土星的图标,而且如果土星在模型中的两个变量的值是-7 和-9,那么这个命令将建立一个 pixmap object,把土星的图像放在图中这两个变量的位置上。

set pixmap 2 "saturn.png" at -7, -9, f(-7, -9) width screen 0.06

set pixmap 2 给 object 设置了索引 2,可以用来在以后需要时取消或者重新修改定义之用。"width screen 0.06 "这句话将 pixmap 的宽度设置为图形总宽度的 0.06;这里需要尝试几次来找到一个好的尺寸。

在使用类似的命令定义了所有需要的 pixmaps 之后,使用 splot 对 f()函数绘图,就可以将曲面与所有的行星一起绘制出来。生成下图的完整脚本也在附录中。

[行星像素图]

3D bar charts

Gnuplot 一直支持条形图(bar chart)。新版本让这些图表支持了第三个维度。现在你可以这些组数据的 boxwidth。绘制三维柱状图的(3D bar chart 或者在 gnuplot 中被称为 box plot)的命令,是 2D 版本命令的一个简单扩展。要绘制 2D 直方图或条形图,plot 命令需要一系列的水平坐标和数值,以及 with boxes 命令。要制作三维柱状图,就是使用 3D 版的 plot、splot(它的原意是 "surface plot"),为每个柱状图提供 x、y 和相应的数值。

这可以很好地可视化展示那些依赖两个变量的离散数据。例子的话,我们将以我们用于蜘蛛图的 COVID-19 数据为例,再增加几个月的数据,看看从 3 月大流行开始直到近期的所有数据。下面的就是我们的数据,来源和之前一样:

    Italy, United States, Honduras, France, Canada, Switzerland
    2.729, 34.945, 0.202, 206.114, 74.18, 3.964, "3-12"
    617.373, 1436.877, 39.679, 2518.465, 2867.833, 1601.048, "4-12"
    1854.187, 2137.452, 202.532, 3635.583, 3496.515, 4072.221, "5-12"
    3905.638, 6112.782, 774.286, 2383.218, 2583.822, 3577.396, "6-12"
    4016.203, 9811.656, 2784.865, 2615.946, 2843.902, 3779.832, "7-12"

现在每一行都有一个附加的日期 label,我们可以用它来创建 tic label。生成以下图表的完整脚本也提供在附录中了。我们给每个国家都设置了自己的颜色,条形图的高度表示每个国家和月份的确认病例数量。

 [三维柱状图]

Many improvements

这里我们只介绍了主要的新特性,但在 5.4 中还有许多额外改进,在 release note 和官方文档里都有介绍。gnuplot 中的大量交互式地帮助信息也在新版本中得到了彻底的修改,以覆盖所有新特性。其中一项新的增强功能是在支持 64 位整数运算的系统上运行时,自动使用 64 位整数运算。gnuplot 的大部分内部计算都是以浮点运算完成的,但是当使用 32 位整数时,有些运算,如阶乘或指数,即使提供的是 integer 参数,如果结果会溢出 32 位整数的上限的话,也会返回浮点数。现在,当提供 integer 参数时,这些函数会返回 integer 结果。其他的新特性包括:能够将图形投射到任何一个坐标平面上,有更多方法来渲染曲面和轮廓线(contour lines),改进了 array syntax,支持 LaTeX pict2e 图形环境,以及更多的 Bessel 函数(人们总是很欢迎这些改动)。

Gnuplot 并不适合每一个人。但由于它集强大的功能、脚本能力和灵活性于一身,它在技术性或科学绘图领域中占据了独特的地位。那些熟悉它的特有用法的人经常会有新的收获,因为它从上世纪 80 年代开始就在一直不断改进,直到现在也没有任何放缓的迹象。

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值