该模块提供了 Python 到 Matplotlib 绘图库的 Julia 接口,特别是matplotlib.pyplot
模块。
PyPlot 使用 Julia PyCall 包直接从 Julia 调用 Matplotlib,几乎不需要任何开销(数组无需复制即可传递)。 (另请参阅 PythonPlot.jl,了解使用替代 PythonCall.jl 包的 PyPlot.jl 版本。)
该软件包利用 Julia 的多媒体 I/O API 在任何 Julia 图形后端中显示绘图,包括在 IJulia 中作为内联图形。或者,您可以使用基于 Python 的图形 Matplotlib 后端来支持交互式绘图缩放等。
(此 PyPlot 包取代了 Junfeng Li 早期的同名包,该包通过 ZeroMQ 套接字与 IPython 使用 PyPlot。)
您需要在计算机上安装 Python Matplotlib 库才能使用 PyPlot。您可以使用 IJulia 进行内联绘图(不需要 GUI 后端),也可以使用 Matplotlib 的 Qt、wx 或 GTK+ 后端,如下所述。
一旦安装了 Matplotlib,您就可以在 Julia 中使用Pkg.add("PyPlot")
来安装 PyPlot 及其依赖项。
如果您将 PyCall 设置为使用 Conda.jl 包来安装私有(不在系统PATH
中)Julia Python 发行版(通过 Miniconda),则 PyPlot 将根据需要自动安装 Matplotlib。
如果您是第一次安装 PyCall 和 PyPlot,只需在运行Pkg.add("PyPlot")
之前执行ENV["PYTHON"]=""
即可。否则,您可以通过以下方式重新配置 PyCall 以使用 Conda:
ENV [ " PYTHON " ] = " "
Pkg . build ( " PyCall " )
下次导入PyPlot
时,它会告诉 Conda 安装 Matplotlib。
在 MacOS 上,您应该安装适用于 MacOS 10.9 或更高版本的 XQuartz 或安装 Anaconda Python 发行版,以获得功能齐全的 PyPlot。
MacOS 10.9 附带了 Python 和 Matplotlib,但此版本的 Matplotlib 默认使用 Cocoa GUI 后端,PyPlot 不支持。它还有一个受支持的 Tk 后端,但除非安装 XQuartz,否则 Tk 后端无法工作。
或者,您可以安装 Anaconda Python 发行版(其中还包括ipython
和其他 IJulia 依赖项)。
否则,您可以使用 Homebrew 包管理器:
brew install python gcc freetype pyqt
brew link --force freetype
export PATH= " /usr/local/bin: $PATH "
export PYTHONPATH= " /usr/local/lib/python2.7: $PYTHONPATH "
pip install numpy scipy matplotlib
(您可能需要将两个export
命令添加到~/.profile
文件中,以便在启动 shell 时自动执行它们。)
一旦安装了 Matplotlib 和 PyPlot,并且您正在使用具有图形功能的 Julia 环境(例如 IJulia),您只需using PyPlot
进行键入即可开始调用 matplotlib.pyplot API 中的函数。例如:
using PyPlot
# use x = linspace(0,2*pi,1000) in Julia 0.6
x = range ( 0 ; stop = 2 * pi , length = 1000 ); y = sin .( 3 * x + 4 * cos .( 2 * x));
plot (x, y, color = " red " , linewidth = 2.0 , linestyle = " -- " )
title ( " A sinusoidally modulated sinusoid " )
一般来说,所有参数(包括关键字参数)与 Python 中的完全相同。 (当然,有一些小的翻译,例如 Julia 使用true
和nothing
来代替 Python 的True
和None
。)
完整的matplotlib.pyplot
API 过于广泛,无法在此描述;有关更多信息,请参阅 matplotlib.pyplot 文档。 Matplotlib 版本号由PyPlot.version
返回。
仅导出当前记录的matplotlib.pyplot
API。要使用模块中的其他函数,您还可以将matplotlib.pyplot.foo(...)
调用为plt.foo(...)
。例如, plt.plot(x, y)
也可以。 ( matplotlib
模块的原始PyObject
也可以作为PyPlot.matplotlib
访问。)
Matplotlib 在大小写方面有些不一致:它有contour3D
但有bar3d
,等等。 PyPlot 将所有此类函数重命名为使用大写D (例如,它有hist2D
、 bar3D
等)。
您还必须显式限定某些内置 Julia 函数的函数。特别是,必须使用PyPlot.xcorr
、 PyPlot.axes
和PyPlot.isinteractive
来访问matplotlib.pyplot.xcorr
等。
如果您希望像 Python 中的惯例那样通过plt.somefunction(...)
专门访问所有PyPlot 函数,您可以执行import PyPlot; const plt = PyPlot
而不是using PyPlot
。
您可以通过调用gcf()
将当前图窗作为Figure
对象( matplotlib.pyplot.Figure
的包装器)获取。
Figure
类型支持 Julia 的多媒体 I/O API,因此您可以使用display(fig)
来显示fig::PyFigure
并使用show(io, mime, fig)
(或 Julia 0.4 中的writemime
)将其写入给定的mime
类型Matplotlib 后端支持的字符串(例如"image/png"
或"application/pdf"
)。
如果您从交互式 Julia 提示符(例如 Julia 命令行提示符或 IJulia 笔记本)使用 PyPlot,则在计算绘图函数( plot
等)后会立即显示绘图。
但是,如果您从非交互运行的 Julia 脚本(例如julia myscript.jl
)使用 PyPlot,则 Matplotlib 将以非交互模式执行:直到运行show()
(相当于plt.show()
Python 示例中的plt.show()
)。
PyPlot 可以使用任何能够显示 PNG、SVG 或 PDF 图像的 Julia 图形后端,例如 IJulia 环境。要使用不同的后端,只需使用所需的Display
调用pushdisplay
即可;有关更多详细信息,请参阅 Julia 多媒体显示 API。
另一方面,您可能希望使用 Python Matplotlib 后端之一为每个绘图打开一个交互式窗口(用于交互式缩放、平移等)。您可以随时通过运行以下命令来执行此操作:
pygui ( true )
为后续绘图打开基于 Python 的 GUI(如果可能),而pygui(false)
将返回到 Julia 后端。即使 Python GUI 正在运行,您也可以通过运行display(gcf())
使用 Julia 后端显示当前图窗。
如果导入 PyPlot 时没有可用的 Julia 图形后端,则pygui(true)
是默认值。
PyPlot 仅支持 Tk、wxWidgets、GTK+(版本 2 或 3)和 Qt(版本 4 或 5;通过 PyQt5、PyQt4 或 PySide)、Python GUI 后端。 (显然,您必须先安装这些 Python 工具包之一。)默认情况下,PyPlot 在启动时选择其中一个(基于您安装的工具包),但您可以通过导入以下命令来强制选择特定的工具包: PyCall 模块并在导入 PyPlot之前使用其pygui
函数设置 Python 后端:
using PyCall
pygui (gui)
using PyPlot
其中gui
当前可以是:tk
、 :gtk3
、 :gtk
、 :qt5
、 :qt4
、 :qt
或:wx
之一。您还可以通过 matplotlibrc 文件中的 Matplotlib rcParams['backend']
参数设置默认值。
PyPlot 模块还导出一些基于 matplotlib.colors 和 matplotlib.cm 模块的函数和类型,以简化颜色图的管理(用于为各种绘图类型中的颜色分配值)。尤其:
ColorMap
:matplotlib.colors.Colormap 类型的包装器。提供了以下构造函数:
ColorMap{T<:Colorant}(name::String, c::AbstractVector{T}, n=256, gamma=1.0)
通过对Colorant
s 的数组c
中的颜色进行n
插值(来自ColorTypes.jl 包)。如果您希望自动构造name
,请改为调用ColorMap(c, n=256, gamma=1.0)
。或者,您可以分别传递 RGB 或 RGBA 分量的 3 列或 4 列矩阵(类似于 Matplotlib 中的 ListedColorMap),而不是传递颜色数组。
甚至可以通过传递红色、绿色、蓝色和(可选)alpha 分量的 (x,y0,y1) 元组数组来定义更通用的颜色图,如 matplotlib.colors.LinearSegmentedColormap 构造ColorMap{T<:Real}(name::String, r::AbstractVector{(T,T,T)}, g::AbstractVector{(T,T,T)}, b::AbstractVector{(T,T,T)}, n=256, gamma=1.0)
所定义,通过: ColorMap{T<:Real}(name::String, r::AbstractVector{(T,T,T)}, g::AbstractVector{(T,T,T)}, b::AbstractVector{(T,T,T)}, n=256, gamma=1.0)
或ColorMap{T<:Real}(name::String, r::AbstractVector{(T,T,T)}, g::AbstractVector{(T,T,T)}, b::AbstractVector{(T,T,T)}, alpha::AbstractVector{(T,T,T)}, n=256, gamma=1.0)
ColorMap(name::String)
返回现有(已注册)颜色图,相当于 matplotlib.pyplot.get_cmap( name
)。
Python 函数返回的matplotlib.colors.Colormap
对象会自动转换为ColorMap
类型。
get_cmap(name::String)
或get_cmap(name::String, lut::Integer)
调用 matplotlib.pyplot.get_cmap 函数。
register_cmap(c::ColorMap)
或register_cmap(name::String, c::ColorMap)
调用 matplotlib.colormap.register 函数。
get_cmaps()
返回当前注册的颜色图的Vector{ColorMap}
。
请注意,给定支持 SVG 的显示环境(例如 IJulia), ColorMap
和Vector{ColorMap}
对象将以图形方式显示;尝试get_cmaps()
!
PyPlot 包还从 Matplotlib 的 mplot3d 工具包导入函数。然而,与 Matplotlib 不同的是,您可以直接创建 3d 绘图,而无需先创建 Axes3d 对象,只需调用以下之一即可: bar3D
、 contour3D
、 contourf3D
、 plot3D
、 plot_surface
、 plot_trisurf
、 plot_wireframe
或scatter3D
(以及text2D
、 text3D
)就像 Axes3d 相应命名的方法一样。我们还导出类似于 Matlab 的同义词surf
表示plot_surface
(或导出plot_trisurf
表示一维数组参数),导出mesh
表示plot_wireframe
。例如,您可以执行以下操作:
surf ( rand ( 30 , 40 ))
绘制随机的 30×40 表面网格。
您还可以通过例如subplot(111, projection="3d")
显式创建具有 3d 轴的子图,与 Matplotlib 中完全相同,但您必须首先调用using3D()
函数以确保加载 mplot3d(这种情况发生)对于plot3D
等自动)。 Axes3D
构造函数和 art3D 模块也被导出。
Matplotlib 允许您在绘图标签、标题等中使用 LaTeX 方程,只需将方程括在字符串中的美元符号 ( $ ... $
) 中即可。然而,在 Julia 字符串文字中输入 LaTeX 方程很尴尬,因为需要进行转义以防止 Julia 解释美元符号和反斜杠本身;例如,LaTeX 方程$alpha + beta$
在 Julia 中将是文字字符串"$\alpha + \beta$"
。
为了简化这一点,PyPlot 使用 LaTeXStrings 包提供一个新的LaTeXString
类型,该类型通过L"...."
构造,无需转义反斜杠或美元符号。例如,我们可以简单地将上述方程写为L"$alpha + beta$"
,因此您可以执行以下操作:
title ( L " Plot of $ G amma_3(x)$ " )
如果您的字符串仅包含方程式,则可以省略美元符号,例如L"alpha + beta"
,它们将自动添加。作为一个额外的好处, LaTeXString
在 IJulia 中自动显示为渲染方程。有关详细信息,请参阅 LaTeXStrings 包。
默认情况下,IJulia 中的绘图会以 PNG 图像的形式发送到笔记本。或者,您可以告诉 PyPlot 在浏览器中将绘图显示为 SVG 图像,其优点是与分辨率无关(这样它们在高分辨率下显示时不会出现像素化,例如,如果您将 IJulia 笔记本转换为 PDF),方法是跑步:
PyPlot . svg ( true )
这不是默认设置,因为浏览器中的 SVG 绘图显示速度要慢得多(尤其是复杂的绘图),并且在某些 SVG 支持有问题的浏览器中可能显示不准确。 PyPlot.svg()
方法返回当前是否启用 SVG 显示。
请注意,这与手动将绘图导出为 SVG 或任何其他格式完全分开。无论 PyPlot 是否使用 SVG 进行浏览器显示,您都可以随时使用 Matplotlib savefig 命令将绘图导出为 SVG,例如savefig("plot.svg")
。
您可以按照以下示例更改 Matplotlib 用于全局参数的rcParams
字典:
rcParams = PyPlot . PyDict (PyPlot . matplotlib. " rcParams " )
rcParams[ " font.size " ] = 15
(如果您改为使用PyPlot.matplotlib.rcParams
,PyCall 将复制字典,以便 Python rcParams
不会被修改。)
该模块由 Steven G. Johnson 编写。