Skip to main content

简化在 python 中使用 gnuplot 的管理器

项目描述

<nav class="contents" id="contents" role="doc-toc">

内容

</nav>

介绍

该软件包允许使用 gnuplot 程序以 2D 或 3D 绘图的形式在 python 中绘制数据或数学表达式。

可以打开多个绘图窗口,并为每个绘图窗口启动一个单独的 gnuplot 进程。要绘制的数据可以通过将它们写入文件来传输到 gnuplot,或者可以发送到 gnuplot inline。数学表达式作为字符串直接发送到 gnuplot。所有包功能都可以通过调用函数来访问,其列表在 本文档末尾的可用函数列表部分中报告。

这个包是从我自己的需要开始设计的,所以只实现了非常有限的许多 gnuplot 功能,但将来可能会添加更多:

  • 从数据中绘制 2D 或 3D 图形

  • 以 2D 或 3D 绘制数学表达式

最常用的绘图设置,例如应用对数刻度或设置刻度限制,可以通过将参数传递给函数来应用,而无需知道具体的 gnuplot 命令。但是,也可以将任意命令传递给 gnuplot,如向 gnuplot 发送任意命令一节中所述。

本文档中给出的示例可以通过复制'>>>'之后的表达式并粘贴到 python 控制台命令行中来执行。请注意,尽管它们已经过测试,但仍然可能出现错误。

这个包是在 GPL 许可下发布的,希望它对其他人有用。欢迎反馈、错误报告和建议。

封装结构

该软件包包含以下模块:

global_variables.py

包含全局变量,主要用于定义一些参数的默认值;

错误.py

包含包函数返回的错误消息;

类.py

包含_PlotWindow类,用于创建包含 gnuplot 进程(subprocess.Popen 的实例和绘图上的一些信息的结构;

函数.py

包含用于创建绘图窗口并在其上绘制数据或数学表达式的所有函数;

函数实用程序.py

包含一些不打算由用户直接调用的实用功能;

演示.py

一个小演示脚本;

测试.py

用于测试大多数包功能的脚本。

导入包

如何导入

要导入gnuplot_manager,您可以像往常一样使用import指令:

>>> import gnuplot_manager

或者

>>> import gnuplot_manager as gm

或者也

>>> from gnuplot_manager import *

在模块导入时检查 gnuplot 安装

导入模块时,它会检查 gnuplot 程序的可用性并相应地设置全局变量gnuplot_installed。这是通过调用应该安装在几乎所有 Linux 发行版中的程序来实现的。但是,如果您的系统上没有安装它,则gnuplot_installed变量将设置为None

gnuplot_installed=真

安装了 gnuplot

gnuplot_installed=False

未安装 gnuplot

gnuplot_installed=无

没有找到,所以没有检查gnuplot的安装

例子:

>>> print(gm.gnuplot_installed)
True

创建一个新的绘图窗口

new_plot ()函数

要打开一个新的绘图窗口,请使用new_plot()函数

>>> myplot2d = gm.new_plot(plot_type='2D', title='My 2D Plot')

该函数返回_PlotWindow类的一个实例。请注意,绘图窗口不会出现在屏幕上,直到您在其上绘制一些东西。

您可以指定 2 种绘图类型:“2D”和“3D”,默认为“2D”。如果您给窗口一个标题,将标题参数传递给new_plot()函数,它将显示在窗口上,此时将在窗口上绘制一些东西。所有参数都是可选的:如果调用函数时没有传递任何参数,它会返回一个没有标题的“2D”图。

窗口创建期间的错误

如果给new_plot()函数提供了无效或不一致的参数,则使用默认值创建一个绘图窗口,并在_PlotWindow 实例的错误属性中存储一个带有数字和错误消息的元组。例子:

>>> myplot = gm.new_plot(plot_type='4D')
>>> print(myplot.error)
(14, 'unknown plot type "4D", using default "2D"')

持久性

如果在打开新绘图时提供persistence=True参数,则在 gnuplot 进程终止后窗口将保持可见,如关闭绘图窗口部分所述。但是,关闭 gnuplot 进程后,可能无法进行某些操作,例如缩放和重新缩放。

>>> myplot = gm.new_plot(title='Persistent plot', persistence=True)

默认行为存储在PERSISTENCE全局变量中:

>>> print(gm.PERSISTENCE)
False

Gnuplot 输出管理

当您打开一个新的绘图窗口时,您可以指定您喜欢如何处理相关 gnuplot 进程的输出,将 redirect_output参数传递给new_plot()函数:

重定向输出=假

gnuplot 输出和错误分别发送到/dev/stdout/dev/stderr ,就像从终端调用程序时一样。这在从控制台使用 gnuplot 时很有用,可以立即获得输出;

重定向输出=真

输出保存到文件中,这些文件存储在 gnuplot.out/output/gnuplot.out/errors/目录中;

重定向输出=无

输出被抑制,将其发送到/dev/null

您可以为打开的每个窗口指定不同的行为:

>>> myplot1 = gm.new_plot(title='Output suppressed', redirect_output=None)
>>> myplot2 = gm.new_plot(title='Output saved on files', redirect_output=True)
>>> myplot3 = gm.new_plot(title='Output shown on console', redirect_output=False)

默认行为存储在REDIRECT_OUT全局变量中:

>>> print(gm.REDIRECT_OUT)
False

清除数据文件

默认情况下,每次在绘图窗口上绘制新数据或函数时都会删除旧数据文件,除非给出replot=True选项[ 1 ]。如果要更改此行为,保留数据文件,可以将purge=False参数传递给new_plot()函数。

其他绘图窗口属性

打开绘图窗口时,您可以指定其他几个属性,例如:终端类型、窗口尺寸、屏幕上的位置、轴范围、标签等。

阅读new_plot()函数的文档字符串以获取所有可用选项的列表(按q退出帮助页面):

>>> help(gm.new_plot)

默认窗口属性

new_plot()函数使用的终端类型、窗口尺寸和屏幕上窗口位置的默认值不是 newplot 使用的默认值。它们存储在以下全局变量中:

  • DEFAULT_TERM

  • DEFAULT_WIDTH

  • DEFAULT_HEIGHT

  • DEFAULT_XPOS

  • DEFAULT_YPOS

第一个是字符串(例如'x11'),而其他的则是表示窗口位置和大小(以像素为单位)的数字。

如果要使用 gnuplot 默认值打开绘图窗口,可以传递 gnuplot_default参数:

>>> myplot = gm.new_plot(gnuplot_default=True, title='Using gnuplot defaults')

从数据中绘图

从数据中绘制二维曲线

在绘制 2D 数据之前,必须先打开 2D 绘图窗口,如创建新绘图窗口部分所述:

>>> myplot2d = gm.new_plot(plot_type='2D', title='My 2D Plot')

要绘制 2D 数据,请使用plot2d()函数,将_PlotWindow 实例作为第一个参数传递。第二个和第三个参数必须是一维数据结构,例如 numpy 数组、列表或元组[ 2 ],具有相同的大小,包含要绘制的点的 x 值和 y 值。例如,如果第二个和第三个参数是两个数组xy

  • 要绘制的第一个点具有坐标(x[0]y[0]

  • 第二个点有坐标(x[1]y[1]

  • 等等…

第三个参数(可选)是一个字符串,用作图例中的标签。例子:

>>> x = numpy.linspace(0,100,1001)
>>> y = x * x
>>> gm.plot2d(myplot2d, x, y, label='y=x^2')
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/parabola-1.png

屏幕上应该会出现一个 gnuplot 窗口,并且应该在其上绘制一条抛物线。plot2d ()函数返回一个包含数字和字符串的元组:如果没有错误,则数字为零且字符串为'Ok',否则返回大于零的数字和描述错误的字符串。

所有错误消息的列表都包含在error.py模块中:

>>> help(gm.errors)

绘制一维数据

也可以为 gnuplot 提供一组数据,通常如果您想通过plot_1d()函数提供 y 值并让 gnuplot 自动创建 x 值。该功能仅适用于 2D 绘图窗口。例子:

>>> y = numpy.linspace(0,100,101)
>>> gm.plot1d(myplot2d, y, label='1D data')
(0,'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot1d.png

在前面的示例中,gnuplot 使用序数 1-100 作为绘图点的 x 值。

绘制直方图

plot2d ()函数也可用于绘制直方图。如果通过参数style='histeps'打开绘图,则数据将绘制为直方图,其中每个 x 值被解释为 bin 的中心值,每个 y 值被解释为关联的频率。例子:

>>> myhistogram = gm.new_plot(style='histeps', title='My Histogram')
>>> bins = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> freq = [1, 1, 4, 7, 8, 6, 3, 1, 0]
>>> gm.plot2d(myhistogram, bins, freq, label='My frequency data')
(0,'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/histogram-1.png

应绘制直方图。请注意,在这种情况下,我们将xy值放在列表中,而不是 numpy 数组中,但我们也可以将它们放在元组中,获得相同的效果。

您还可以使用更改窗口属性部分中描述的plot_set()函数在 已打开的 2D 绘图窗口上设置“histeps”样式。

绘制箱线图

函数plot_box()允许从一组数据中绘制箱线图。例子:

>>> data = numpy.random.normal(3,20,50)
>>> gm.plot_box(myplot2d, data, width=100, label='My boxplot')
(0,'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/boxplot.png

绘制 3D 数据

要绘制 3D 数据,必须使用选项 plot_type = '3D'打开绘图窗口,如创建新绘图窗口 部分所述:

>>> myplot3d = gm.new_plot(plot_type='3D', title='3D Plot')

然后,plot3d()函数可用于在窗口上绘制数据,将_PlotWindow实例作为第一个参数传递,将要绘制的点的 x、y 和 z 值作为以下参数传递。

要绘制的 x、y 和 z 值必须存储在大小相等的一维数据结构中,并包含要绘制的每个点的 x、y 和 z 坐标。例如,如果您传递三个数组xyz

  • 要绘制的第一个点具有坐标(x[0]y[0]z[0]

  • 第二个点有坐标(x[1]y[1]z[1]

  • 等等…

3D 曲线图示例:

>>> x = numpy.linspace(0,100,1001)
>>> y = numpy.linspace(0,200,1001)
>>> z = x * y
>>> gm.plot3d(myplot3d, x, y, z, label='3D curve')
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/3Dplot-1.png

绘制带有曲线的 3D 图。如果您在窗口上单击鼠标并移动指针,则可以旋转轴,改变视角(这是由 gnuplot 制作的,而不是由这个包制作的)。

在前面的示例中,绘制的是 3D 曲线,而不是曲面,因为每个x值仅给出一个y值。要绘制曲面,您必须为每个x值提供一组y值,以在xy平面上形成值网格。在 4 x 4 点的网格上绘制z=x+y曲面所需的点示例:

(x=0, y=0, z=0) (x=0, y=1, z=1) (x=0, y=2, z=2) (x=0, y=3, z=3)
(x=1, y=0, z=1) (x=1, y=1, z=2) (x=1, y=2, z=3) (x=1, y=3, z=4)
(x=2, y=0, z=2) (x=2, y=1, z=3) (x=2, y=2, z=4) (x=2, y=3, z=5)
(x=3, y=0, z=3) (x=3, y=1, z=4) (x=3, y=2, z=5) (x=3, y=3, z=6)

所以要给plot3d()函数的数据是:

>>> x = numpy.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3])
>>> y = numpy.array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3])
>>> z = x + y
>>> gm.plot3d(myplot3d, x, y, z, label='z = x  + y')
(0, 'Ok')

应该绘制一个十字网格,它们是z = x + y表面的点:

https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/3Dplot-2.png

在绘图中添加更多曲线

要在同一个图上添加新数据,您必须传递replot=True参数:

>>> x1 = numpy.linspace(0,100,1001)
>>> y1 = x1 * x1
>>> gm.plot2d(myplot2d, x1, y1, label='My first 2D data')
(0, 'Ok')
>>> x2 = numpy.linspace(0,100,2001)
>>> y2 = x2 * x2 * x2 / 100
>>> gm.plot2d(myplot2d, x2, y2, label='My second 2D data', replot=True)
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot2d-replot.png

但是,如果要在同一个图上绘制多条曲线,使用下一节中描述的plot_curves()函数会更有效。

同时绘制多条曲线

函数plot_curves()允许一次绘制多条曲线,这比使用replot选项一次绘制一条曲线要快,因为 gnuplot 只被调用一次。此外,它允许您添加带有任意选项的字符串以提供给 gnuplot。

要绘制的数据必须记录在一个列表中,每个元素本身就是一个列表,由 2D 绘图的 4 个元素或 3D 绘图的 5 个元素组成。

对于 2D 图,每个列表元素的形式为[x, y, label, options],而对于 3D 图,它的形式为[x, y, z, label, options],其中:

  • x是要绘制的点的 x 坐标数组:对于 2d 绘图窗口,它也可以设置为None,在这种情况下,该曲线的 x 值由 gnuplot 自动创建;

  • y是要绘制的点的 y 坐标数组;

  • z是要绘制的点的 z 坐标数组(仅适用于 3D 绘图);

  • label是一个字符串,带有要在绘图图例中显示的标签,如果您不想设置标签,则为None

  • options是一个字符串,其中包含您想要提供给 gnuplot 的附加选项,[ 3 ]None如果您不想提供它们

例子:

>>> x1 = numpy.linspace(0, 100, 101)
>>> y1 = 2 * x1
>>> z1 = x1 * y1
>>> x2 = numpy.linspace(0, 100, 201)
>>> y2 = 3 * x2
>>> z2 = x2 * y2 / 10
>>> list2d = [ [x1, y1, 'my first data 2D', None], [x2, y2, 'my second data 2D', 'with lines'] ]
>>> list3d = [ [x1, y1, z1, 'my first data 3D', None], [x2, y2, z2, 'my second data 3D', 'with linespoints'] ]

传递给plot_curves()的第一个参数必须是您要操作的绘图,而第二个是列表:

>>> gm.plot_curves(myplot2d, list2d)
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot_curves-1.png
>>> gm.plot_curves(myplot3d, list3d)
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot_curves-2.png

您还可以使用函数plot_curves()绘制单条曲线,它允许为 gnuplot 提供额外的选项,但是列表必须有一个元素,它本身就是 4 或 5 个元素的列表,所以不要忘记放双方括号

>>> x1 = numpy.linspace(0,100,101)
>>> y1 = x1 * x1
>>> gm.plot_curves(myplot2d, [ [ x1, y1, 'only one curve', 'with linespoints'] ])
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot_curves-3.png

如果要将新曲线添加到先前绘制的曲线中,也可以在plot_curves()函数中指定replot =True选项。例子:

>>> x1 = numpy.linspace(0,3.14, 101)
>>> y1 = numpy.sin(x1)
>>> x2 = numpy.linspace(0,3.14, 51)
>>> y2 = numpy.cos(x2)
>>> list2da = [ [x1, y1, 'my first data 2D', None], [x2, y2, 'my second data 2D', None] ]
>>> list2db = [ [x1, 2*y1, 'my third data 2D', None], [x2, 2*y2, 'my fourth data 2D', None] ]
>>> gm.plot_curves(myplot2d, list2da)
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot_curves-4.png
>>> gm.plot_curves(myplot2d, list2db, replot=True)
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot_curves-5.png

数据文件

将要绘制的数据写入文件,这些文件保存在当前工作目录中创建的gnuplot.out/data/目录中。数据文件的名称具有以下形式:

gnuplot_data_w<n>(<window-title>)_<type>_c<m>(<curve-label>).csv

  • <n>是窗口编号

  • <window-title>是作为窗口标题提供给new_plot()函数的字符串

  • <type>为 '1D'、'2D' 或 '3D',其中 '1D' 表示已省略 x 值

  • <m>是曲线编号

  • <curve-label>是作为标签提供给绘图函数的字符串

如果没有给出窗口标题和/或曲线标签,文件名将丢失括号之间的一个或两个部分。

请注意,在编写文件名时, INVALID_CHARS全局变量中列出的字符将从窗口标题和曲线标签中删除,并替换为存储在 SUBSTITUTE_CHAR变量中的字符(即“_”,除非您更改它)。

绘制易失性数据

也可以在不将数据写入磁盘的情况下将数据传递给 gnuplot。这可以通过将volatile=True参数传递给本节中描述的任何绘图函数来实现。在这种情况下,不会创建数据文件,而是使用特殊文件名'-'将数据作为字符串与绘图命令一起传递给 gnuplot 。

请注意,以这种方式绘制数据有一些限制:如果有从易失性数据绘制的曲线,则无法使用replot选项在同一绘图窗口上绘制其他曲线或函数。因此,如果您想在同一绘图窗口中混合使用易失性曲线(即使用volatile参数绘制的曲线)与非易失性曲线或函数,则必须将易失性曲线绘制为最后的绘图指令。例子:

>>> x = numpy.linspace(0,100,101)
>>> y = x * x
>>> z = y * x / 100
>>> gm.plot_function(myplot2d, 'x**2','function')
>>> gm.plot2d(myplot2d, x, y, label='non volatile data', replot=True)
>>> gm.plot2d(myplot2d, x, z, label='volatile data', volatile=True, replot=True)
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/volatile.png

请注意,如果在绘图窗口上绘制了易失性数据,则 gnuplot 不允许在其上切换对数刻度。

绘制数学函数

绘制数学表达式

如果您还没有打开 2D 绘图窗口(例如,因为您已经从索引跳转到该部分),您现在应该使用创建新绘图窗口部分中描述的new_plot() 函数进行操作:

>>> myplot2d = gm.new_plot(plot_type='2D', title='My 2D Plot')

函数plot_function()允许传递给 gnuplot 一个字符串,表示一个数学函数[ 4 ]

>>> gm.plot_function(myplot2d, 'sin(x)', label='sin(x)')
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot_function-1.png

要绘制 3D 函数,您必须打开一个 3D 绘图窗口,如果您还没有这样做的话:

>>> myplot3d = gm.new_plot(plot_type='3D', title='My 3D Plot')
>>> gm.plot_function(myplot3d, 'sin(x)*cos(y)', label='sin(x)*cos(y)')
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot_function-2.png

如果label参数未给出或设置为None,gnuplot 将自动使用函数字符串作为图例的标签。如果您不想显示任何标签,请传递参数label=""(空字符串)。

添加数学表达式

默认情况下,plot_function()删除之前在窗口上绘制的任何内容。您可以使用replot=True选项在之前绘制的内容之上绘制函数

>>> gm.plot_function(myplot2d, 'x*x', label='y=x^2')
(0, 'Ok')
>>> gm.plot_function(myplot2d, '2*x*x', label='y=2x^2', replot=True)
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot_functions-1.png

绘制几个数学表达式

函数plot_functions()允许在单个绘图操作中绘制任意数量的数学表达式,并允许为每个字符串提供带有额外 gnuplot 选项的字符串。

要绘制的表达式必须记录在一个列表中,其中每个元素本身就是一个由 3 个字符串组成的列表:

  • 第一个是数学表达式;

  • 第二个是要在情节图例上显示的标签;

  • 第三个包含您想为 gnuplot 提供的其他选项,[ 5 ]None如果您不想提供它们。

>>> list2d = [ ['x*x', 'y=x^2', 'with lines'],  ['2*x*x', 'y=2x^2','with points'] ]
>>> gm.plot_functions(myplot2d, list2d)
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot_functions-2.png
>>> list3d = [ ['sin(x)*cos(y)', 'z=sin(x)cos(y)', None], ['2*sin(x)*cos(y)', 'z=2sin(x)cos(y)', None] ]
>>> gm.plot_functions(myplot3d, list3d)
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot_functions-3.png

如果您不想手动设置标签,请将None放在它们的位置,gnuplot 将自动创建它们,或者输入“”(空字符串)并且不会显示任何标签。

您可以将replot=True参数传递给绘图函数,而无需删除之前绘制的任何内容。

也可以绘制单个数学表达式,并可以为 gnuplot 提供其他选项(记住双方括号):

>>> gm.plot_functions(myplot2d, [ ['x*x', 'y=x^2', 'with linespoints'] ])
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot_functions-4.png

检查窗口属性

在绘图窗口上打印信息

plot_check ()函数打印有关作为参数给出的绘图窗口的信息:

>>> myplot = gm.new_plot(plot_type='2D', title='2D plot')
>>> x = numpy.linspace(0,100,101)
>>> y = x * x
>>> z = y * x / 100
>>> gm.plot2d(myplot, x, y, label='y=x^2')
(0, 'Ok')
>>> gm.plot_function(myplot, 'x**2', replot=True)
(0, 'Ok')
>>> gm.plot2d(myplot, x, z, label='y=x^3/100', volatile=True, replot=True)
(0, 'Ok')
>>> gm.plot_check(myplot)
Window index:         0
Window number:        0
Terminal type:        "x11"
Persistence:          "False"
Purge:                "True"
Window type:          "2D"
Window title:         "2D plot"
Number of functions:  1
Number of curves:     1
Number of volatiles:  1
X-axis range:         [None,None]
Y-axis range:         [None,None]
(0, 'Ok')

如果给出了expand=True参数,它会打印更多信息,包括 gnuplot 进程的 PID 和数据文件的名称:

>>> gm.plot_check(myplot, expanded=True)
Window index:         0
Window number:        0
Terminal type:        "x11"
Persistence:          "False"
Purge:                "True"
Window type:          "2D"
Window title:         "2D plot"
Number of functions:  1
Number of curves:     1
Number of volatiles:  1
X-axis range:         [None,None]
Y-axis range:         [None,None]
Gnuplot process PID:  58937
Gnuplot output file:  "/dev/stdout"
Gnuplot errors file:  "/dev/stderr"
Functions
#  0: "x**2"
Curves
#  0: "gnuplot.out/data/gnuplot_data_w0_2D(2D plot)_c0(y=x^2).csv"
(0,'Ok')

该函数还有两个参数:

打印输出(默认为True):

如果设置为True,输出将打印在/dev/stdout/

获取字符串(默认为False):

如果设置为True,则返回带有输出的字符串。这对于将输出写入文件或 GUI 窗口内很有用。

在所有绘图窗口上打印信息

plot_list ( )函数为所有打开的窗口打印 plot_check() 函数给出的相同信息 。

关闭绘图窗口

关闭单个绘图窗口

当您不再需要绘图窗口时,可以通过plot_close()函数将其关闭,该函数执行以下操作:

  • 通过向其发送退出gnuplot 命令,终止与作为参数给出的_PlotWindow实例关联的 gnuplot 进程;

  • _PlotWindow实例的plot_type属性设置为None

  • 从window_list全局变量中删除_PlotWindow实例。

_PlotWindow实例的名称(例如myplot)不会从命名空间中删除。但是,如果您尝试将其传递给包的任何函数,则会返回错误消息:

>>> gm.plot_close(myplot2d)
(0. 'Ok')
>>> gm.plot_function(myplot2d, 'x**2')
(11, 'trying to operate on a closed plot window')

删除绘图窗口名称的影响

请注意,如果您创建一个具有名称(例如myplot)的绘图窗口,然后创建另一个具有相同名称的绘图窗口,则第一个窗口仍在内存中(并且关联的 gnuplot 进程仍然处于活动状态),但未链接到该名称(我的情节)了。例子:

>>> myplot = gm.new_plot()
>>> myplot = gm.new_plot(plot_type='3D')
>>> gm.plot_list()
Window index:         0
Window number:        0
Terminal type:        "x11"
Persistence:          "False"
Purge:                "True"
Window type:          "2D"
Window title:         "None"
Number of functions:  0
Number of curves:     0
Number of volatiles:  0
X-axis range:         [None,None]
Y-axis range:         [None,None]

Window index:         1
Window number:        1
Terminal type:        "x11"
Persistence:          "False"
Purge:                "True"
Window type:          "3D"
Window title:         "None"
Number of functions:  0
Number of curves:     0
Number of volatiles:  0
X-axis range:         [None,None]
Y-axis range:         [None,None]
Z-axis range:         [None,None]
(0, 'Ok')

在这里,我们使用了在检查窗口属性部分中描述的plot_list()函数 来列出所有打开的窗口。现在我们有两个绘图窗口,一个 2D 和一个 3D,但只有第二个与名称myplot相关联,而第一个不再与任何名称相关联。但是,第一个窗口仍然存在于window_list 全局变量中,因此它显示在窗口列表中。

类似地,如果您从命名空间中删除绘图窗口名称(例如,通过 del命令)而之前没有调用plot_close()函数,则关联的_PlotWindow实例及其 gnuplot 进程不会关闭,并且仍然存在于window_list变量中。例子:

>>> myplot = gm.new_plot()
>>> gm.plot_check(myplot)
Window index:         0
Window number:        0
Terminal type:        "x11"
Persistence:          "False"
Purge:                "True"
Window type:          "2D"
Window title:         "None"
Number of functions:  0
Number of curves:     0
Number of volatiles:  0
X-axis range:         [None,None]
Y-axis range:         [None,None]
(0, 'Ok')

>>> del myplot
>>> gm.plot_check(myplot)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'myplot' is not defined

>>> gm.plot_list()
Window index:         0
Window number:        0
Terminal type:        "x11"
Persistence:          "False"
Purge:                "True"
Window type:          "2D"
Window title:         "None"
Number of functions:  0
Number of curves:     0
Number of volatiles:  0
X-axis range:         [None,None]
Y-axis range:         [None,None]
(0, 'Ok')

删除myplot名称后,无法通过 plot_check(myplot)检查绘图窗口,因为该窗口不再与该名称链接。但是,我们仍然可以使用plot_list()函数检查绘图窗口,因为它依赖于window_list全局变量的内容,而del命令并未更改该内容。仍然可以将窗口引用为window_list[index],其中 indexplot_list()函数输出中给出的窗口索引。

您还可以创建一个绘图窗口(即_PlotWindow实例)而不给它命名:

>>> x = linspace(0,100,101)
>>> gm.plot1d(gm.new_plot(),x)

通过这种方式,绘图窗口被创建并直接作为参数传递给绘图函数(在本例中为plot1d())而不给它命名。同样在这种情况下,新创建的绘图窗口将出现在plot_list()函数的输出中。

plot_close_all ()函数, 在一次关闭所有打开的窗口段落中描述,关闭所有绘图窗口(并终止它们关联的 gnuplot 进程),包括那些未链接到任何名称的窗口。

删除输出文件

当绘图窗口关闭时,与曲线关联的数据文件是否被删除,取决于其purge属性的值,该值是在绘图窗口打开时根据传递给new_plot ( )函数。例子:

>>> myplot = gm.new_plot(purge=True)

每次绘制新数据(不提供replot=True参数)和关闭窗口时,数据文件都将被删除;

>>> myplot = gm.new_plot(purge=False)

每次绘制新数据时 不会删除数据文件,关闭窗口时也不会删除数据文件。

默认行为存储在PURGE_DATA全局变量中:

>>> print(gm.PURGE_DATA)
True

如果通过redirect_output=True参数打开绘图,则 gnuplot 输出和错误已被重定向的文件将被删除或以不同的方式删除。如果要保留它们,当窗口激活清除选项时,可以将 keep_output=True参数传递给plot_close()函数。

可选的延迟参数指定在将退出命令发送到 gnuplot之后,在删除数据文件之前等待的时间(以秒为单位) 。这在某些情况下很有用,例如,如果你想创建一个持久窗口,在上面绘制一些复杂的东西,然后关闭 gnuplot 进程,只留下窗口打开:

>>> myplot = gm.new_plot(persistence=True, purge=True)
>>> x = numpy.linspace(0, 1000, 1000000)
>>> y = x * x
>>> gm.plot2d(myplot, x, y)
(0, 'Ok')
>>> gm.plot_close(myplot, delay=1)
(0, 'Ok')

调用 plot_close()函数时,它会立即向 gnuplot 发送 退出命令,但只有在 gnuplot 完成plot2d()函数启动的绘图操作后才会执行。如果在发送退出命令后立即删除数据文件,则可以在绘图操作(绘制一百万个点)仍在进行中时将其删除。

一次关闭所有打开的窗口

plot_close_all ()函数关闭window_list 全局变量中列出的所有绘图窗口,并将其清空。它可以调用plot_close()函数,因此它得到相同的参数。

>>> gm.plot_close_all()
(0, 'Ok')

默认情况下,如果gnuplot.out目录为空,该函数会尝试删除该目录。如果您不想删除它,可以传递purge_dir=False参数。

执行其他操作

更改窗口属性

您可以使用plot_set()函数更改绘图窗口的某些属性,例如对数刻度或坐标轴范围。例如,设置对数 x 轴:

>>> myplot = gm.new_plot(logx=False)
>>> gm.plot_set(myplot, logx=True)   # I have changed my mind...
(0, 'Ok')

默认情况下,新选项在绘制新曲线或函数时应用:如果要立即应用它们,在已绘制的项目上,传递replot=True参数:

>>> x = numpy.linspace(1, 100, 100)
>>> y = numpy.exp(x)
>>> gm.plot2d(myplot, x, y)
(0, 'Ok')
>>> gm.plot_set(myplot, logx=False, logy=True, replot=True)
(0, 'Ok')

要了解哪些设置可用,请阅读函数文档字符串:

>>> help(gm.plot_set)

在这个函数中只实现了 gnuplot 提供的许多可能的设置中的一小部分。但是,您可以使用plot_command() 函数向 gnuplot 发送您希望的任何命令,如向 gnuplot 发送任意命令一节中所述。

令人耳目一新的窗户

您可以随时使用plot_replot()函数刷新绘图窗口:

>>> gm.plot_replot(myplot)
(0, 'Ok')

如果您通过单击关闭按钮关闭了窗口,这将导致它重新出现。

您可以通过plot_replot_all()函数一次刷新所有绘图窗口:

>>> gm.plot_replot_all()
(0, 'Ok')

重置窗口

plot_reset ()函数允许重置窗口属性:

  • 删除所有曲线和函数

  • 清除绘图区域

plot_axes参数,默认为True 告诉函数在清除窗口后绘制轴[ 7 ] 。

如果一个轴具有完全负的定义范围(例如 [-2,-1])并且已设置对数刻度,则恢复线性刻度,因为不可能绘制任何数据。

plot_reset_all ()函数一次重置所有绘图窗口。

在绘图窗口上打印标签

您可以使用plot_label()函数在绘图窗口上打印任意字符串

>>> myplot = gm.new_plot()
>>> gm.plot_label(myplot, x=10, y=10, label='This is a parabola !', erase=False)
(0, 'Ok')
>>> gm.plot_function(myplot,'x**2')
(0, 'Ok')
https://raw.githubusercontent.com/pietromandracci/gnuplot_manager/master/images/plot_label-1.png

x 和 y 给出了字符串必须打印的位置,以字符表示,从图形的左下角 (x=1,y=1) 开始。erase=True参数在打印之前删除所有先前打印的字符串。如果您传递了erase=True,但不传递 label参数,则该图将从先前打印的标签中清除:

>>> gm.plot_label(myplot, erase=True)
(0, 'Ok')

默认情况下,标签不会立即打印,而是在绘制新的函数曲线时显示。如果您希望标签立即显示,您可以传递replot=True参数。但是,只有在之前绘制了一些图或曲线(因此可以重新绘制)时,它才会起作用。

>>> gm.plot_label(myplot, x=50, y=20, label='Hello !', erase=False, replot=True)
(0, 'Ok')