Методы графиков
|
Страница в процессе перевода. |
Makie предлагает простой, но эффективный набор методов для каждой функции построения графиков, которые позволяют легко создавать рисунки и управлять их общими аспектами.
У каждого объекта графика, такого как Scatter, есть две функции построения графика: неизменяющая версия (scatter) и изменяющая версия (scatter!). У этих функций есть различные методы, которые ведут себя немного по-разному в зависимости от первого аргумента.
Вот их краткий список, прежде чем мы рассмотрим каждую версию более подробно. В качестве примера взят график Scatter, но те же принципы действуют для графика любого типа.
Неизменяющая версия
Неизменяющие методы создают и возвращают что-либо в дополнение к объекту графика: либо рисунок с осью в позиции по умолчанию, либо ось в заданной позиции GridPosition или GridSubposition.
scatter(args...; kwargs...) -> ::FigureAxisPlot
scatter(gridposition, args...; kwargs...) -> ::AxisPlot
FigureAxisPlot — это просто коллекция, содержащая новый рисунок, ось и график. Для удобства она имеет ту же перегрузку отображения, что и Figure, что позволяет вызову scatter(args...) отображать график без дополнительных усилий. Ее можно разложить при присваивании: fig, ax, plotobj = scatter(args...).
AxisPlot — это коллекция, содержащая новую ось и график. У нее нет специальной перегрузки отображения, но ее также можно разложить в виде ax, plotobj = scatter(gridposition, args...).
Специальные именованные аргументы
Методы, создающие AxisPlot, принимают специальный именованный аргумент axis. В нем можно передать объект наподобие словаря с именованными аргументами, которые следует передать создаваемой оси. Методы, создающие FigureAxisPlot, дополнительно принимают специальный именованный аргумент figure. В нем можно передать объект наподобие словаря с именованными аргументами, которые следует передать создаваемому рисунку.
Все остальные именованные аргументы передаются в функцию построения графика как атрибуты.
Вот два примера с функцией scatter (будьте внимательны: правильно создавайте NamedTuple с одним аргументом, например с запятой в конце).
using CairoMakie
# FigureAxisPlot принимает именованные аргументы figure и axis.
fig, ax, p = lines(cumsum(randn(1000)),
figure = (size = (1000, 600),),
axis = (ylabel = "Temperature",),
color = :red)
# AxisPlot принимает именованный аргумент axis.
lines(fig[2, 1], cumsum(randn(1000)),
axis = (xlabel = "Time (sec)", ylabel = "Stock Value"),
color = :blue)
fig
Изменяющая версия
Изменяющие методы всегда просто возвращают объект графика. Если рисунок не передается, используется current_figure(); если не указана ось или сцена, используется current_axis().
scatter!(args...; kwargs...) -> ::Scatter
scatter!(figure, args...; kwargs...) -> ::Scatter
scatter!(gridposition, args...; kwargs...) -> ::Scatter
scatter!(axis, args...; kwargs...) -> ::Scatter
scatter!(scene, args...; kwargs...) -> ::Scatter
GridPosition
У каждого объекта Figure есть объект GridLayout из пакета GridLayoutBase.jl, который отвечает за корректное размещение элементов графика. Для удобства вы можете обращаться к рисунку по индексам для доступа к вложенным позициям сетки, что позволяет легко и быстро компоновать сложные макеты.
Например, fig[1, 2] создает позицию GridPosition, ссылающуюся на строку 1 и столбец 2, в то время как fig[1, 2][3, 1:2] создает позицию GridSubposition, ссылающуюся на строку 3 и столбцы 1—2 во вложенном макете GridLayout, который расположен в строке 1 и столбце 2. Ссылка на рисунок находится в родительском поле макета верхнего уровня.
Неизменяющие функции построения графиков
При использовании неизменяющих функций построения графиков с GridPosition создаются новые оси в указанных местах. Если макет GridLayout еще не существует на уровнях вложенности, он создается автоматически для удобства.
using CairoMakie
fig = Figure()
# первая строка, первый столбец
scatter(fig[1, 1], 1.0..10, sin)
# первая строка, второй столбец
lines(fig[1, 2], 1.0..10, sin)
# первая строка, третий столбец, затем вложенная первая строка, первый столбец
lines(fig[1, 3][1, 1], cumsum(randn(1000)), color = :blue)
# первая строка, третий столбец, затем вложенная вторая строка, первый столбец
lines(fig[1, 3][2, 1], cumsum(randn(1000)), color = :red)
# вторая строка, столбцы с первого по третий
ax, hm = heatmap(fig[2, 1:3], randn(30, 10))
# все строки, новый столбец после последнего
fig[:, end+1] = Colorbar(fig, hm)
fig
Изменяющие функции построения графиков
Изменяющие функции построения графиков работают с GridPosition немного иначе. Сначала проверяется, существует ли уже одна (и только одна) ось в заданной позиции. Если да, график строится по этой оси. Если нет, функция выдает ошибку.
using CairoMakie
fig = Figure()
lines(fig[1, 1], 1.0..10, sin, color = :blue)
# это работает, потому что предыдущая команда создала ось в позиции fig[1, 1]
lines!(fig[1, 1], 1.0..10, cos, color = :red)
# следующая строка пока не будет работать, так как в позиции fig[1, 2] оси нет
# lines!(fig[1, 2], 1.0..10, sin, color = :green)
fig[1, 2] = Axis(fig)
# теперь она работает
lines!(fig[1, 2], 1.0..10, sin, color = :green)
# также работает с вложенными сетками
fig[2, 1:2][1, 3] = Axis(fig)
lines!(fig[2, 1:2][1, 3], 1.0..10, cos, color = :orange)
# однако часто удобнее сохранить ось, чтобы использовать ее повторно
ax, _ = lines(fig[2, 1:2][1, 1:2], 1.0..10, sin, color = :black)
lines!(ax, 1.0..10, cos, color = :yellow)
fig