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

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, Switzerland2.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深度文章以及开源社区的各种新近言论~

LWN:Gnuplot 5.4中的新功能!相关推荐

  1. drx功能开启后_简单实用!小米手机中这些新功能真香

    小米手机作为国产机热销品牌之一,它除了有好看的外观,还有很多隐藏的实用功能,今天小编就来和大家分享5个小米手机里你不知道的功能. Al电话助理 看到陌生号码时,很多人第一反应就是挂掉,不想接听,但又担 ...

  2. SQLSERVER2014中的新功能

    SQLSERVER2014中的新功能 转载自:http://blog.csdn.net/maco_wang/article/details/22701087 博客人物:maco_wang SQLSER ...

  3. java中怎样定义实数_Java Math 类中的新功能,第 1 部分: 实数

    在这篇由两部分组成的文章中,Elliotte Rusty Harold 与您一起探讨经典 java.lang.Math 类中的"新"功能.第 1 部分主要讨论比较单调的数学函数.第 ...

  4. Windows Server 2012 DHCP 服务器中的新功能:故障转移和策略

    Windows Server 2012 DHCP 服务器中的新功能如下: DHCP 故障转移:此功能提供让两个 DHCP 服务器服务于 同一子网或作用域的 IP 地址和选项配置的能力,前提是 DHCP ...

  5. spring 5.x(1)-----Spring Framework 5.x中的新功能

    Spring Framework 5.x中有什么新功能 5.1版中的新功能 一般核心修订 基础设施: 在类路径和模块路径上对JDK 11的无警告支持. 支持Graal原生图像约束(反射,参数名称). ...

  6. Java平台,标准版Oracle JDK 9中的新功能

    Java平台,标准版 Oracle JDK 9中的新增功能 版本9 E77563-05 2017年9月 JDK 9中的新功能概述 Java Platform,Standard Edition 9是一个 ...

  7. bit1618c 功能简介_c 9中的新功能简介

    bit1618c 功能简介 With the upcoming release of .NET 5 - the release which unifies the .NET runtimes - Mi ...

  8. Java 11中的新功能和API详解系列1

    Java 11中的新功能和API详解系列1 2018.9.27 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载. JDK 11在语言语法方面有一个小改动,增加了相当数量的新API,以及 ...

  9. PhotoZoom Classic 7中的新功能

    众所周知PhotoZoom Classic是家庭使用理想的放大图像软件.目前很多用户还在使用PhotoZoom Classic 6,对于PhotoZoom Classic 7还是有点陌生.其实在6代衍 ...

最新文章

  1. julia有 pytorch包吗_有了Julia语言,深度学习框架从此不需要计算图
  2. 学计算机专业需要考的证有哪些科目,自考计算机专业的考试科目有哪些?
  3. Vue教程1 【Vue核心】
  4. 高手问答精选:Go 语言 —— 云计算时代的 C 语言
  5. 计算机网络(谢希仁第八版)第二章:物理层
  6. idea中git分支的使用
  7. 《剑指offer》数据流中的中位数
  8. 蚂蚁集团CEO胡晓明宣布辞任
  9. python元类使用场景_python 元类的使用
  10. hyper-v redhat使用新网卡
  11. 设计模式之禅——模板方法模式钩子方法
  12. Linux设备模型(总线、设备、驱动程序和类)
  13. 百度seo排名点击器app_手机端百度搜索排名seo优化_百度移动端整站关键词排名优化...
  14. matlab在图像处理中的应用实验,MATLAB实验Matlab在数字图像处理中的应用
  15. java单元测试方法的使用
  16. 网络渗透基本思路及方法
  17. ArcGIS单波段影像重分类与批处理
  18. 被奉为经典的「金字塔原理」,教给我们哪些PPT写作技巧?
  19. html中选择收货地址时候,选择收货地址.html
  20. kudu之tablet设计原理

热门文章

  1. 更换服务器 百度抓取显示有跳转,网站更换服务器4天了,百度站长后台抓取诊断一直失败,还是抓...
  2. c语言strtok函数完美实现
  3. 数据结构c语言版严蔚敏 顺序表
  4. js 象棋游戏 _ 支持双方在线对战
  5. [设计模式]原型设计模式
  6. 基于java的qq聊天室项目
  7. Pr 入门教程:如何倾斜移位效果?
  8. 3gp转换模式工具_如何将视频转换为手机的3GP
  9. 勤于奋:独家解密国外LEAD联盟赚钱项目,长达20年互联网经验
  10. intel realsense d435深度摄像头使用