本模組提供了 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()
)。
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)}, 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 繪圖,而text2D
先建立 Axes3d 對象,只需呼叫以下之一即可: bar3D
、 contour3D
、 contourf3D
、 plot3D
、 plot_surface
、 plot_trisurf
、 plot_wireframe
或scatter3D
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 編寫。