Gnuplot
一位维基教科书用户认为此页面应该被拆分为主题更窄的较小页面。 您可以通过将此大页面拆分为较小的页面来提供帮助。请确保遵循命名规范。将书籍分成较小的部分可以提供更多关注,并允许每个部分都能做好一件事,这将使每个人受益。 |
gnuplot 是一个命令行驱动的跨平台绘图程序。尽管名字如此,它与 GNU 项目无关,也不受 GNU GPL 约束。源代码许可证是一个免费许可证,但不是复制许可证;“允许修改软件,但不允许分发完整的修改后的源代码”。[1]
gnuplot 可以交互使用,批处理模式使用,或嵌入(由脚本)到另一个程序中,例如GNU Octave。
- 交互使用,运行gnuplot在命令行中。
- 在批处理模式下,运行gnuplot input.plt(其中input.plt是输入文件的名称)在命令行中。
- 在另一个程序中,使用该程序的绘图功能——gnuplot 将被透明地调用。
- 为了在自己的程序中使用,可以通过popen,运行 gnuplot,或者使用包装 gnuplot 的编程语言库。这些包装库存在于 C、C++(例如 Gnuplot-iostream、gnuplot-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 terminal和output行。
- 以交互方式启动 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]要为维基媒体生成图形
- 将您的代码存储在文件中,最好加上注释
- 使用高质量(矢量图形)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 在维基百科
- 如何在维基百科文章中创建图表 中有一节关于 gnuplot
- 《从 Unix 命令行进行 Ad Hoc 数据分析》(Ad Hoc Data Analysis From The Unix Command Line)这本书有一章关于 使用 gnuplot 快速绘图
- commons
- commons:Category:Gnuplot diagrams 包含许多 gnuplot 图表的例子,其中许多还附有源代码。
- 包含 Gnuplot 源代码的图像
- 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.