Документация Engee

Методы графиков

Страница в процессе перевода.

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
1279903

Изменяющая версия

Изменяющие методы всегда просто возвращают объект графика. Если рисунок не передается, используется 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
d23d451

Изменяющие функции построения графиков

Изменяющие функции построения графиков работают с 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
8eafbda