跳转到内容

Gnuplot

0% developed
来自维基教科书,开放世界中的开放书籍

gnuplot 是一个命令行驱动的跨平台绘图程序。尽管名字如此,它与 GNU 项目无关,也不受 GNU GPL 约束。源代码许可证是一个免费许可证,但不是复制许可证;“允许修改软件,但不允许分发完整的修改后的源代码”。[1]

gnuplot 可以交互使用,批处理模式使用,或嵌入(由脚本)到另一个程序中,例如GNU Octave

  • 交互使用,运行gnuplot在命令行中。
  • 在批处理模式下,运行gnuplot input.plt(其中input.plt是输入文件的名称)在命令行中。
  • 在另一个程序中,使用该程序的绘图功能——gnuplot 将被透明地调用。
  • 为了在自己的程序中使用,可以通过popen,运行 gnuplot,或者使用包装 gnuplot 的编程语言库。这些包装库存在于 C、C++(例如 Gnuplot-iostreamgnuplot-cpp)、Python、Perl、Java、Fortran95 等等。

作为非常简单的用法,启动 gnuplot 并输入

plot sin(x)
exit

这将显示正弦函数的绘图,然后退出。

要绘制函数或函数

  • 定义函数
  • 确定输入输出范围
  • 确定区域图表样式
  • 绘制它(使用plot函数)

要绘制数据,请将数据收集到文件中,而不是定义函数。

纯文本

[编辑 | 编辑源代码]

取消默认装饰将产生一个完全空白的图形区域

unset title
unset key
unset xtics
unset ytics
set border 0

如果需要,现在可以单独设置这些字段。

坐标轴

[编辑 | 编辑源代码]

百分比

[编辑 | 编辑源代码]

要将坐标轴格式化为百分比,请将数字乘以 100 并使用format添加“%”符号,例如

set format y "%g %%"
plot "dat1.txt" using 1:($2*100)

函数类型

[编辑 | 编辑源代码]

分段函数

[编辑 | 编辑源代码]
参见:分段函数


有多种方法。

? 操作符

[编辑 | 编辑源代码]

可以使用三元条件运算符(?:)在 gnuplot 中绘制分段函数。例如,可以通过以下方式手动定义绝对值函数:

f(x) = x > 0 ? x : -x

将其理解为“如果...那么...否则”:“如果x大于 0,那么 否则

可以将这些链接起来,例如:

f(x) = x < 1 ? 1 \
     : x < 2 ? 3 \
             : 5

这对应于分段函数

对于分段函数,您可能需要许多样本,这样间断点就会显示为垂直线,拐角就会显得尖锐,所以

set sample 1001

(使用 1001 而不是 1000 可以避免在间断点上出现样本点的伪影,这会导致 "阶梯状" 的效果。)

分别绘制每个函数

[edit | edit source]

或者您可以分别绘制每个函数,就像您现在正在做的那样。

f(x) = a1*x**2+b1*x+c1  for x in [t11,t12]
f(x) = a2*x**2+b2*x+c2  for x in [t21,t22]
f(x) = a3*x**2+b3*x+c3  for x in [t31,t32]
....
....
...

其中

t11<=t12<=t21<=t22, etc.

参数模式

[edit | edit source]

更好的是,切换到参数模式,将公共 t 区间 [0:1] 映射到您各个的 t 范围,然后

x1(t) = t11+t*(t12-t11) ...

plot x1(t), f1(x1(t)), x2(t), f2(x2(t)), ... 分别绘制每个函数

源文件

[edit | edit source]

gnuplot 允许您通过以下方式加载文件load命令,或在命令行中将它们作为参数传递。这对于复杂的图形非常有用。

没有官方的标准扩展名,但一些半官方的扩展名被使用

  • .plt, .gnu, .gpi,.gih用于一般的 gnuplot 文件;
  • .dat用于数据;
  • .fnc用于函数定义。

对于格式化源代码,两个有用的语法片段是

注释
井号 (#) 字符开始行内注释,一直持续到行尾。
行延续
尾随反斜杠 (\) 是行延续字符,允许您将一个长表达式拆分为多行。您还可以缩进/对齐延续行以提高可读性(如分段函数),因为初始空格会被忽略。

调试

[edit | edit source]

要调试 gnuplot 文件,通常很有用的是

  • 将终端更改为交互式(而不是输出到文件),方法是注释掉set terminaloutput行。
  • 以交互方式启动 gnuplot,然后load要调试的 gnuplot 文件。
  • 在文件末尾加上pause -1(暂停直到回车),然后从命令行运行它。
    • 或者,使用-persist命令行开关运行 gnuplot,这样 gnuplot 会退出,但窗口会保留。
  • 通过 Shebang (#!) 符号使文件本身可执行(取决于确切的路径)
#!/usr/bin/gnuplot -persist

语法高亮

[edit | edit source]

vim 只要文件扩展名为 .gpi,就会自动为 gnuplot 进行语法高亮 (gnuplot.vim)。

或者,其他文件扩展名,如.plt,可以通过通常的 autocommand 方式添加

au BufNewFile,BufRead *.plt,*.gnuplot setf gnuplot

另请参见与 pathogen 的自动文件类型检测功能兼容的 github 存储库

颜色

[edit | edit source]

colorsequence

[edit | edit source]

语法

   set colorsequence {default|classic|podo}

离线帮助

   help set colorsequence
  • cycle set
 set linetype 1 lc rgb "dark-violet" lw 2 pt 0
   set linetype 2 lc rgb "sea-green"   lw 2 pt 7
   set linetype 3 lc rgb "cyan"        lw 2 pt 6 pi -1
   set linetype 4 lc rgb "dark-red"    lw 2 pt 5 pi -1
   set linetype 5 lc rgb "blue"        lw 2 pt 8
   set linetype 6 lc rgb "dark-orange" lw 2 pt 3
   set linetype 7 lc rgb "black"       lw 2 pt 11
   set linetype 8 lc rgb "goldenrod"   lw 2
   set linetype cycle 8


9 cycle set

# https://stackoverflow.com/questions/46775612/colorsequence-for-more-than-8-colors-gnuplot
# Ethan A Merritt - my preference for gnuplot colors
 # 2 3 4 5 6 8 are borrowed from the colors_podo set
 #
 set linetype  1 lc rgb "dark-violet" lw 1
 set linetype  2 lc rgb "#009e73" lw 1
 set linetype  3 lc rgb "#56b4e9" lw 1
 set linetype  4 lc rgb "#e69f00" lw 1
 set linetype  5 lc rgb "#f0e442" lw 1
 set linetype  6 lc rgb "#0072b2" lw 1
 set linetype  7 lc rgb "#e51e10" lw 1
 set linetype  8 lc rgb "black"   lw 1
 set linetype  9 lc rgb "gray50"  lw 1
 set linetype cycle  9

代码

[edit | edit source]
  • gnuplot/src/getcolor.c
  • gnuplot/src/graphics.c
  • gnuplot/src/color.c

生成维基媒体图形

[edit | edit source]
参见:如何为维基百科文章创建图表:gnuplot

要为维基媒体生成图形

  • 将您的代码存储在文件中,最好加上注释
  • 使用高质量(矢量图形)SVG输出。
  • 生成 SVG。
  • 可选地进行后处理。
  • 图形源代码上传到维基媒体公用。

详细信息如下。


gnuplot 选项

[edit | edit source]

这是一个示例标题

set terminal svg enhanced size 300 300
set samples 1001  # high quality
set border 31 linewidth .3 # thin border
set output "filename.svg"

(文件名应该更改为更具描述性的名称,但这并非严格必要。)

这将创建一个名义上为 300 × 300 的 SVG,这是维基媒体的常见显示大小:最容易制作名义大小为预期显示大小的图形,但要注意图像可以而且确实被调整大小,这会影响粗细可读性 - 如果使用较大的名义大小,这样它很可能会被缩小,请使用大字体粗线。

要注意,对于水平书写,y 轴标签很可能比 x 轴标签占据更多空间(水平方向),因此名义上是正方形的图形实际上绘图区域的高度会略微大于宽度。

您可以通过以下方式设置字体

set terminal svg enhanced size 300 300 fname "Times" fsize 36

技术细节

[edit | edit source]
set terminal svg
将输出设置为 SVG 文件
enhanced
表示使用增强的文本输出,当需要希腊字母时。您可以在 [此处] 找到表格。
size 300 300
将 SVG 的名义大小设置为 300 × 300
set samples 1001
这将设置许多样本以获得高质量;1001(而不是 1000)是为了使样本不太可能直接落在像素或间断点上,这会导致混叠。如果您遇到意外混叠,请尝试将其更改为 1002 或 1003,因为这将移动所有样本点,可能解决问题。
set border 31 linewidth .3
“31” 在二进制中是 1111,表示 "所有边框";使用二进制中的 "3" (0011) 仅表示下边框和左边框。较细的线宽会使边框不那么突出,突出了线条。[注意,31 在二进制中实际上是 11111。第五位与本示例无关,示例应该用 15 代替 31 重写。] 注意,使用交互式 gnuplot 命令 "help set border" 以查看有关每一位控制内容的说明。
set output "filename.svg"
这将设置输出文件名。在正常使用中,选择一个更能描述文件内容的文件名。

后处理

[edit | edit source]

您可能希望对 SVG 进行后处理,无论是在 Inkscape 等矢量图形程序中,还是手工进行(因为 SVG 文件是文本)。这对于添加在 gnuplot 中难以生成的注释很有用,或者您可以将绘图作为更大或更复杂图形的一部分合并。

维基媒体公用上传

[edit | edit source]
  • 请使用模板{{gnuplot}}将其标记为使用 gnuplot 制作。
  • 源代码可以包含在说明的 "源代码" 部分(如果简短),或者更常见的是包含在单独的== gnuplot 源代码 ==部分。
  • 如果源代码用 语法高亮 包装,它最具可读性
<syntaxhighlight lang="gnuplot">
...
</syntaxhighlight>
  • 如果您使用文本,它可能会被翻译 - 请使用模板{{Translation possible}}以指示可以进行翻译。
    • 或者,最小化文本的使用(放在单独的标题中),以便在其他语言中重复使用图像。

设计注意事项

[编辑 | 编辑源代码]

在图表设计中,有很多需要考虑的因素,因为图表被视为信息图形。信息图形设计师的作品和著作是一个很好的参考资料,例如,爱德华·塔夫特(Edward Tufte)的著作广受好评:他的《定量信息的视觉呈现》(The Visual Display of Quantitative Information)与图表最为相关,但他的作品以及其他人的作品也可以提供启发和灵感。

第一个要考虑的问题是绘制什么,以及图表是否是传达某些信息的最佳方式:图表可能出乎意料地有用,或者相反,图表可能不是传达信息的最佳方式。此外,图表如何与其他材料连接和整合是一个问题——它是被引用了吗?被描述和讨论了吗?

作为图表替代或辅助的其它媒介包括:

  • 文本,可以是正文、列表或独立的单个项目(摘录)
  • 表格
  • 示意图
  • 动画(可能是动画图表)
  • 照片

通常,以多种方式呈现相同信息是有益的。

第二个问题是使用多少个图表。

  • 最明显的是可以使用一个**单个**、大型、详细的图表,这在许多情况下是合适的,例如,如果数据的细节很重要。
  • 或者,考虑使用**小倍数**——几个小的图表来表达一个观点,通过重复和变化,类似于书面上的“比较和对比”。
    对齐图表或将它们放置在网格上尤其有用,这样眼睛可以轻松地在它们之间切换。
    以不同的比例呈现相同的数据也可能很有启发性;一个简单的例子是在估算符号中显示的,其中相同的数据以绝对比例和相对比例显示。
  • 也可以使用**内联**图表,如火花图。

除了这些一般性考虑之外,还有一些更细致的问题:

  • 显示数据范围是多少?
  • 使用什么比例?例如,图表区域的范围是否应该与数据的范围一致(最大限度地利用空间),或者范围是否应该更大,提供上下文?通常,对数比例或对数-对数比例是合适的,但可能令新手读者感到困惑。
  • 如何区分数据?使用什么颜色和线型?
  • 如何突出显示各种数据——不同的线条应该有多粗或多细,文本应该有多大?

其他维基媒体资源

[编辑 | 编辑源代码]

参考资料

[编辑 | 编辑源代码]

外部链接

[编辑 | 编辑源代码]
  • gnuplot 中心 – 首页
  • domain_coloring(gnuplot)
  • "gnuplot 不常问问题". 存档于 原始位置 于 2012-10-29。
  • Janert, Philipp K. (2015), 《Gnuplot 实战,第二版》, Manning 出版社, 纽约, 美国, 第 425 页, ISBN 978-1-633430-18-1.
  • Phillips, Lee (2012), 《gnuplot 食谱》, Packt 出版社, 第 220 页, ISBN 184951724X.
华夏公益教科书