Объединение компонентов
Plot
Напомним, что определение объекта Plot имеет следующий вид:
mutable struct Plot{TT<:AbstractVector{<:AbstractTrace},TL<:AbstractLayout,TF<:AbstractVector{<:PlotlyFrame}}
data::TT
layout::TL
frames::TF
divid::UUID
config::PlotConfig
end
Получив одну или несколько линий AbstractTrace и, по желанию, макет (Layout), мы строим объект Plot с помощью любого из следующих конструкторов:
# Чистый холст без линий и макета
Plot()
# Вектор линий и макет
Plot{T<:AbstractTrace}(data::AbstractVector{T}, layout::AbstractLayout)
# Вектор линий — предоставляется макет по умолчанию
Plot{T<:AbstractTrace}(data::AbstractVector{T})
# Одна линия: будет помещена в вектор — предоставляется макет по умолчанию
Plot(data::AbstractTrace)
# Одна линия и макет (линия помещается в вектор)
Plot(data::AbstractTrace, layout::AbstractLayout)
Обратите внимание, что ни в одном из рекомендуемых конструкторов не требуется передавать поле divid вручную. Это внутреннее поле, используемое для отображения и уникальной идентификации нескольких графиков на одной веб-странице.
Вспомогательные методы
Существует также ряд вспомогательных методов для функции Plot, которые попытаются построить линии. Они имеют следующие сигнатуры.
#
PlotlyBase.Plot — Type
Plot(x, y)
Plot(x, y, l; kind, config, kwargs...)
Строит график с одной линией типа kind и задает для x x, а для y — y. Все именованные аргументы передаются напрямую как именованные аргументы в создаваемую линию.
ПРИМЕЧАНИЕ. Если y является матрицей, для каждого столбца y строится одна линия.
ПРИМЕЧАНИЕ. Если x и y являются матрицами, они должны иметь одинаковое количество столбцов (например, N). Затем создаются линии N, где i-й столбец x сопряжен с i-м столбцом y.
Plot(y) Plot(y, l; kwargs...)
Строит график рассеяния и задает для y y. Все именованные аргументы передаются напрямую как именованные аргументы в создаваемый график.
Plot(f, x0, x1) Plot(f, x0, x1, l; config, kwargs...)
Строит график f от x0 до x1 с помощью макета l. Все именованные аргументы применяются к создаваемой линии.
Plot(fs, x0, x1) Plot(fs, x0, x1, l; config, kwargs...)
Для каждой функции в f в fs создает линию рассеяния, которая строит график f от x0 до x1 с помощью макета l. Именованные аргументы применяются ко всем создаваемым линиям.
Именованный аргумент group особенно удобен при вызове Plot(::AbstractDataFrame, ... ; ...). Ниже приведен пример.
using RDatasets
iris = RDatasets.dataset("datasets", "iris");
p = Plot(iris, x=:SepalLength, y=:SepalWidth, mode="markers", marker_size=8, group=:Species)
Объекты SyncPlot
Plot — это чистый объект Julia, который сам по себе не взаимодействует с plotly.js. Это означает, что невозможно просмотреть реальную фигуру plotly, которую представляют данные.
Для этого необходимо связать объект Plot с одним или несколькими фронтендами отображения.
Для реального подключения к фронтендам отображения используется пакет WebIO.jl. Взаимодействие с WebIO заключено в тип SyncPlot, который определяется следующим образом.
mutable struct SyncPlot
plot::PlotlyBase.Plot
scope::Scope
window::Union{Nothing,Blink.Window}
end
Как следует из названия, SyncPlot будет поддерживать представление Julia графика (экземпляр Plot) в синхронизации с графиком с фронтендом.
|
Функция |
Используя WebIO.jl, можно отрисовывать фигуры в любом месте, где это может сделать WebIO. На момент написания этого документа этими местами являются интерактивный скрипт Jupyter, Jupyterlab, веб-приложения Mux.jl, среда Juno Julia в текстовом редакторе Atom и окна Electron из Blink.jl. Дополнительную (и актуальную) информацию можно найти в файле сведений WebIO.jl.
При использовании PlotlyJS.jl в REPL Julia график автоматически отображается в окне Electron. Это выделенное окно браузера, которое мы полностью контролируем. Чтобы увидеть график p, достаточно ввести p в REPL и выполнить строку. Или можно вызвать display(p).
Помимо того, что графики можно просматривать во многих интерфейсных средах, WebIO также обеспечивает двустороннее взаимодействие между javascript и Julia. Фактически, при построении SyncPlot мы автоматически получаем прослушиватели для всех событий plotly.js javascript. Более того, при активации этих событий можно подключать функции Julia в качестве обратных вызовов. В выдуманном примере, приведенном ниже, Julia выводит подробную информацию о точках на графике, когда пользователь наводит на них курсор мыши:
using WebIO
p = plot(rand(10, 4));
display(p) # обычно необязательно
on(p["hover"]) do data
println("\nYou hovered over", data)
end
В следующем примере при щелчке точки символ маркера изменяется на звезду, а цвет маркера — на золотой:
using WebIO
colors = (fill("red", 10), fill("blue", 10))
symbols = (fill("circle", 10), fill("circle", 10))
ys = (rand(10), rand(10))
p = plot(
[scatter(y=y, marker=attr(color=c, symbol=s, size=15), line_color=c[1])
for (y, c, s) in zip(ys, colors, symbols)]
)
display(p) # обычно необязательно
on(p["click"]) do data
colors = (fill("red", 10), fill("blue", 10))
symbols = (fill("circle", 10), fill("circle", 10))
for point in data["points"]
colors[point["curveNumber"] + 1][point["pointIndex"] + 1] = "gold"
symbols[point["curveNumber"] + 1][point["pointIndex"] + 1] = "star"
end
restyle!(p, marker_color=colors, marker_symbol=symbols)
end
Хотя эти примеры совершенно бессмысленны, хотелось бы надеяться, что они демонстрируют возможность создания полнофункциональных, интерактивных веб-приложений для визуализации данных с бизнес-логикой, реализованной полностью на Julia.
Конфигурация отображения
|
Новая возможность в PlotlyBase версии 0.6.4 (PlotlyJS версии 0.16.3) |
При вызове plot или Plot можно указать несколько параметров конфигурации с помощью именованного аргумента config.
Аргумент config должен быть экземпляром PlotConfig, который должен быть построен с использованием именованных аргументов.
Например, при выполнении следующего кода вместо интерактивного графика мы увидим статичный график (без вывода информации при наведении курсора или возможности масштабирования/панорамирования) с четырьмя линиями:
`example plot_config Plot(rand(10, 4), config=PlotConfig(staticPlot=true)) `
Полный список параметров см. в документации по API для PlotConfig.