Этот модуль предоставляет интерфейс Julia для библиотеки построения графиков Matplotlib из Python и, в частности, для модуля matplotlib.pyplot
.
PyPlot использует пакет Julia PyCall для вызова Matplotlib непосредственно из Julia практически без накладных расходов (массивы передаются без копирования). (См. также PythonPlot.jl для версии PyPlot.jl, использующей альтернативный пакет PythonCall.jl.)
Этот пакет использует преимущества мультимедийного API ввода-вывода Julia для отображения графиков в любом графическом интерфейсе Julia, в том числе в виде встроенной графики в IJulia. В качестве альтернативы вы можете использовать графический бэкэнд Matplotlib на основе Python для поддержки масштабирования интерактивного графика и т. д.
(Этот пакет PyPlot заменяет более ранний одноименный пакет от Junfeng Li, который использовал PyPlot через сокет ZeroMQ с IPython.)
Чтобы использовать PyPlot, на вашем компьютере должна быть установлена библиотека Python Matplotlib. Вы можете либо выполнять встроенное построение графиков с помощью IJulia, для которого не требуется серверная часть с графическим интерфейсом, либо использовать серверные части Qt, wx или GTK+ для Matplotlib, как описано ниже.
После установки Matplotlib вы можете просто использовать Pkg.add("PyPlot")
в Julia для установки PyPlot и его зависимостей.
Если вы настроили PyCall для использования пакета Conda.jl для установки частного (не в системном PATH
) дистрибутива Julia Python (через Miniconda), тогда PyPlot автоматически установит Matplotlib по мере необходимости.
Если вы устанавливаете PyCall и PyPlot впервые, просто выполните ENV["PYTHON"]=""
перед запуском Pkg.add("PyPlot")
. В противном случае вы можете перенастроить PyCall для использования Conda через:
ENV [ " PYTHON " ] = " "
Pkg . build ( " PyCall " )
В следующий раз, когда вы импортируете PyPlot
, Conda предложит установить Matplotlib.
В MacOS вам следует либо установить XQuartz для MacOS 10.9 или новее, либо установить дистрибутив Anaconda Python, чтобы получить полнофункциональный PyPlot.
MacOS 10.9 поставляется с Python и Matplotlib, но эта версия Matplotlib по умолчанию использует интерфейс Cocoa GUI, который не поддерживается PyPlot. Он также имеет бэкэнд Tk, который поддерживается, но бэкэнд Tk не будет работать, если вы не установите XQuartz.
Альтернативно вы можете установить дистрибутив 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
, чтобы они автоматически выполнялись при каждом запуске оболочки.)
После установки Matplotlib и PyPlot и использования среды Julia с поддержкой графики, такой как IJulia, вы можете просто ввести текст using PyPlot
и начать вызывать функции в API matplotlib.pyplot. Например:
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. (Конечно, с небольшими переводами, например, Джулия использует true
и nothing
вместо True
и None
в Python.)
Полный API matplotlib.pyplot
слишком обширен, чтобы его можно было описывать здесь; дополнительную информацию см. в документации matplotlib.pyplot. Номер версии Matplotlib возвращается PyPlot.version
.
Экспортируется только документированный на данный момент API matplotlib.pyplot
. Чтобы использовать другие функции в модуле, вы также можете вызвать matplotlib.pyplot.foo(...)
как plt.foo(...)
. Например, plt.plot(x, y)
также работает. (И необработанный PyObject
для модулей matplotlib
также доступен как PyPlot.matplotlib
.)
Matplotlib несколько непоследователен в отношении использования заглавных букв: у него есть contour3D
, но bar3d
и так далее. PyPlot переименовывает все такие функции, используя заглавную букву D (например, hist2D
, bar3D
и т. д.).
Вы также должны явно указать некоторые функции, встроенные в функции Julia. В частности, PyPlot.xcorr
, PyPlot.axes
и PyPlot.isinteractive
должны использоваться для доступа к matplotlib.pyplot.xcorr
и т. д.
Если вы хотите получить доступ ко всем функциям PyPlot исключительно через plt.somefunction(...)
, как это принято в Python, вы можете выполнить import PyPlot; const plt = PyPlot
вместо using PyPlot
.
Вы можете получить текущую фигуру как объект Figure
(обертку matplotlib.pyplot.Figure
), вызвав gcf()
.
Тип Figure
поддерживает API мультимедийного ввода-вывода Julia, поэтому вы можете использовать display(fig)
для отображения fig::PyFigure
и show(io, mime, fig)
(или writemime
в Julia 0.4), чтобы записать его в заданный тип mime
. строка (например "image/png"
или "application/pdf"
), которая поддерживается серверной частью Matplotlib.
Если вы используете PyPlot из интерактивного приглашения Julia, такого как приглашение командной строки Julia или блокнот IJulia, то графики появляются сразу после вычисления функции построения графиков ( plot
и т. д.).
Однако если вы используете PyPlot из сценария Julia, который запускается неинтерактивно (например, julia myscript.jl
), то Matplotlib выполняется в неинтерактивном режиме: окно графика не открывается до тех пор, пока вы не запустите show()
(эквивалентно plt.show()
в примерах Python).
PyPlot может использовать любой графический сервер Julia, способный отображать изображения PNG, SVG или PDF, например среду IJulia. Чтобы использовать другой бэкэнд, просто вызовите pushdisplay
с нужным Display
; более подробную информацию см. в API мультимедийного дисплея Julia.
С другой стороны, вы можете использовать один из серверных модулей Python Matplotlib, чтобы открыть интерактивное окно для каждого графика (для интерактивного масштабирования, панорамирования и т. д.). Вы можете сделать это в любое время, запустив:
pygui ( true )
чтобы включить графический интерфейс на основе Python (если возможно) для последующих графиков, а pygui(false)
вернется в бэкэнд Julia. Даже когда графический интерфейс Python запущен, вы можете отобразить текущую фигуру с помощью бэкэнда Julia, запустив display(gcf())
.
Если при импорте PyPlot графический бэкэнд Julia недоступен, то по умолчанию используется pygui(true)
.
PyPlot поддерживает только Tk, wxWidgets, GTK+ (версия 2 или 3) и Qt (версия 4 или 5; через PyQt5, PyQt4 или PySide), а также GUI-интерфейсы Python. (Очевидно, что вы должны сначала установить один из этих наборов инструментов для Python.) По умолчанию PyPlot выбирает один из них при запуске (в зависимости от того, что вы установили), но вы можете принудительно выбрать конкретный набор инструментов, импортировав PyCall и используя его функцию pygui
для настройки серверной части Python перед импортом PyPlot:
using PyCall
pygui (gui)
using PyPlot
где gui
в настоящее время может быть одним из :tk
, :gtk3
, :gtk
, :qt5
, :qt4
, :qt
или :wx
. Вы также можете установить значение по умолчанию с помощью параметра Matplotlib rcParams['backend']
в вашем файле matplotlibrc.
Модуль PyPlot также экспортирует некоторые функции и типы на основе модулей matplotlib.colors и matplotlib.cm для упрощения управления цветовыми картами (которые используются для присвоения значений цветам в различных типах графиков). В частности:
ColorMap
: оболочка вокруг типа matplotlib.colors.Colormap. Предоставляются следующие конструкторы:
ColorMap{T<:Colorant}(name::String, c::AbstractVector{T}, n=256, gamma=1.0)
создает n
-компонентную цветовую карту путем линейной интерполяции цветов в массиве c
элементов Colorant
s (из Пакет ColorTypes.jl). Если вы хотите, чтобы name
создавалось автоматически, вместо этого вызовите ColorMap(c, n=256, gamma=1.0)
. Альтернативно, вместо передачи массива цветов вы можете передать 3- или 4-столбцовую матрицу компонентов RGB или RGBA соответственно (аналогично ListedColorMap в Matplotlib).
Еще более общие карты цветов могут быть определены путем передачи массивов кортежей (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
).
Объекты matplotlib.colors.Colormap
возвращаемые функциями Python, автоматически преобразуются в тип 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 также импортирует функции из набора инструментов mplot3d Matplotlib. Однако, в отличие от Matplotlib, вы можете создавать 3D-графики напрямую, без предварительного создания объекта Axes3d, просто вызвав один из: bar3D
, contour3D
, contourf3D
, plot3D
, plot_surface
, plot_trisurf
, plot_wireframe
или scatter3D
(а также text2D
, text3D
), ровно как и методы Axes3d с соответствующим названием. Мы также экспортируем синонимы в стиле Matlab surf
plot_surface
( plot_trisurf
для аргументов 1d-массива) и mesh
plot_wireframe
. Например, вы можете сделать:
surf ( rand ( 30 , 40 ))
построить случайную сетку поверхности 30×40.
Вы также можете явно создать подграфик с 3D-осями, например, с помощью subplot(111, projection="3d")
, точно так же, как в Matplotlib, но сначала вы должны вызвать функцию using3D()
, чтобы убедиться, что mplot3d загружен (это происходит автоматически plot3D
и т. д.). Также экспортируются конструктор Axes3D
и модуль art3D.
Matplotlib позволяет использовать уравнения LaTeX в метках графиков, заголовках и т. д., просто заключая уравнения в знаки доллара ( $ ... $
) внутри строки. Однако вводить уравнения LaTeX в строковых литералах Julia неудобно, поскольку экранирование необходимо, чтобы Джулия не интерпретировала сами знаки доллара и обратную косую черту; например, уравнение LaTeX $alpha + beta$
будет буквальной строкой "$\alpha + \beta$"
в Julia.
Чтобы упростить это, 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 для отображения в браузере, вы можете экспортировать график в SVG в любое время с помощью команды Matplotlib savefig, например savefig("plot.svg")
.
Вы можете изменить словарь rcParams
, который Matplotlib использует для глобальных параметров, следуя этому примеру:
rcParams = PyPlot . PyDict (PyPlot . matplotlib. " rcParams " )
rcParams[ " font.size " ] = 15
(Если вместо этого вы использовали PyPlot.matplotlib.rcParams
, PyCall создаст копию словаря, чтобы Python rcParams
не был изменен.)
Этот модуль был написан Стивеном Дж. Джонсоном.