简化在 python 中使用 gnuplot 的管理器
项目描述
内容
介绍
该软件包允许使用 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 值。例如,如果第二个和第三个参数是两个数组x和y:
要绘制的第一个点具有坐标(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')
屏幕上应该会出现一个 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')
在前面的示例中,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')
应绘制直方图。请注意,在这种情况下,我们将x和y值放在列表中,而不是 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')
绘制 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 坐标。例如,如果您传递三个数组x、y和z:
要绘制的第一个点具有坐标(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')
绘制带有曲线的 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表面的点:
在绘图中添加更多曲线
要在同一个图上添加新数据,您必须传递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')
但是,如果要在同一个图上绘制多条曲线,使用下一节中描述的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')
>>> gm.plot_curves(myplot3d, list3d) (0, 'Ok')
您还可以使用函数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')
如果要将新曲线添加到先前绘制的曲线中,也可以在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')
>>> gm.plot_curves(myplot2d, list2db, replot=True) (0, 'Ok')
数据文件
将要绘制的数据写入文件,这些文件保存在当前工作目录中创建的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)
请注意,如果在绘图窗口上绘制了易失性数据,则 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')
要绘制 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')
如果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')
绘制几个数学表达式
函数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')
>>> 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')
如果您不想手动设置标签,请将None放在它们的位置,gnuplot 将自动创建它们,或者输入“”(空字符串)并且不会显示任何标签。
您可以将replot=True参数传递给绘图函数,而无需删除之前绘制的任何内容。
也可以绘制单个数学表达式,并可以为 gnuplot 提供其他选项(记住双方括号):
>>> gm.plot_functions(myplot2d, [ ['x*x', 'y=x^2', 'with linespoints'] ]) (0, 'Ok')
检查窗口属性
在绘图窗口上打印信息
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],其中 index是plot_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')
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')