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

Темы

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

Makie позволяет изменять практически каждый визуальный аспект графиков с помощью атрибутов. Вы можете задавать атрибуты при каждом создании объекта или определить общий стиль, который затем будет использоваться по умолчанию для всех последующих объектов.

Для этой цели можно использовать три функции.

set_theme!
update_theme!
with_theme

Также есть Предварительно определенные темы, которые могут стать полезной отправной точкой.

set_theme!

Вы можете вызвать set_theme!(theme; kwargs...), чтобы изменить текущую тему по умолчанию на theme и переопределить или добавить атрибуты, заданные в kwargs. Вы также можете сбросить изменения, вызвав set_theme!() без аргументов.

Давайте создадим график с темой по умолчанию.

using CairoMakie
function example_plot()
    f = Figure()
    for i in 1:2, j in 1:2
        lines(f[i, j], cumsum(randn(50)))
    end
    Label(f[0, :], "A simple example plot")
    Label(f[3, :], L"Random walks $x(t_n)$")
    f
end

example_plot()
5098f35

Теперь определим тему, которая изменяет размер шрифта по умолчанию, активируем ее и построим график.

fontsize_theme = Theme(fontsize = 10)
set_theme!(fontsize_theme)

example_plot()
b441476

Эта тема будет активна до тех пор, пока мы не вызовем set_theme!().

set_theme!()

объединяем

Темы часто влияют только на часть атрибутов графика. Поэтому темы можно комбинировать, чтобы объединять соответствующие эффекты.

Например, темную тему можно объединить с темой шрифтов LaTeX, чтобы получить и темные цвета, и единообразные шрифты.

dark_latexfonts = merge(theme_dark(), theme_latexfonts())
with_theme(dark_latexfonts) do
    example_plot()
end
c6c8555

update_theme!

Если вы уже активировали тему и хотите частично обновить ее, не удаляя атрибуты, отсутствующие в новой теме, можно воспользоваться функцией update_theme!.

Например, вы можете решить изменить размер текста после активации темной темы и темы LaTeX в предыдущем разделе.

update_theme!(fontsize=30)
example_plot()
d74b37b

with_theme

Чтобы вам не приходилось помнить о необходимости отключения тем, которые нужны только временно, существует функция with_theme(f, theme), которая выполняет сброс автоматически, даже если при выполнении f произошла ошибка.

with_theme(fontsize_theme) do
    example_plot()
end
b2f7ac6

Вы также можете передать дополнительные именованные аргументы для добавления или переопределения атрибутов темы.

with_theme(fontsize_theme, fontsize = 25) do
    example_plot()
end
e4d5b39

Применение тем к объектам графиков

Для применения темы к объектам графиков используйте имена их типов в верхнем регистре в качестве ключа в теме.

lines_theme = Theme(
    Lines = (
        linewidth = 4,
        linestyle = :dash,
    )
)

with_theme(example_plot, lines_theme)
b10b9a3

Применение тем к объектам блоков

К любому блоку, например Axis, Legend, Colorbar и т. д., можно применить тему, используя имя его типа в качестве ключа в теме.

Вот как можно определить простой стиль наподобие ggplot для осей:

ggplot_theme = Theme(
    Axis = (
        backgroundcolor = :gray90,
        leftspinevisible = false,
        rightspinevisible = false,
        bottomspinevisible = false,
        topspinevisible = false,
        xgridcolor = :white,
        ygridcolor = :white,
    )
)

with_theme(example_plot, ggplot_theme)
e99fa17

Циклы

Makie поддерживает множество вариантов автоматического циклического перебора атрибутов графика. Чтобы объект графика мог использовать циклический перебор, либо в его теме по умолчанию, либо в текущей активной теме должен быть задан атрибут cycle.

Указать этот атрибут можно несколькими способами.

# Можно создать список символов
cycle = [:color, :marker]
# или сопоставить определенные атрибуты графика с атрибутами палитры
cycle = [:linecolor => :color, :marker]
# можно также сопоставить несколько атрибутов, которые должны получить
# один и тот же атрибут цикла
cycle = [[:linecolor, :markercolor] => :color, :marker]
# nothing отключает циклический перебор
cycle = nothing # эквивалентно cycle = []

Обратите внимание, что циклы должны быть заданы как атрибуты объекта графика, а не темы верхнего уровня (поскольку разные объекты графика могут циклически перебирать разные атрибуты, например график плотности не может циклически перебирать маркеры). Это проиллюстрировано в следующих блоках кода.

with_theme(
    Theme(
        palette = (color = [:red, :blue], marker = [:circle, :xcross]),
        Scatter = (cycle = [:color, :marker],)
    )) do
    scatter(fill(1, 10))
    scatter!(fill(2, 10))
    scatter!(fill(3, 10))
    scatter!(fill(4, 10))
    scatter!(fill(5, 10))
    current_figure()
end
85a0d53

Параллельные циклы

Создать объект Cycle можно также напрямую, что дополнительно позволяет задать именованный аргумент covary, который по умолчанию равен false. Обработчик цикла с covary = true циклически перебирает все атрибуты вместе, а не по очереди сначала все значения первого, затем второго и т. д.

# palettes: color = [:red, :blue, :green] marker = [:circle, :rect, :utriangle, :dtriangle]

cycle = [:color, :marker]
# 1: :red, :circle
# 2: :blue, :circle
# 3: :green, :circle
# 4: :red, :rect
# ...

cycle = Cycle([:color, :marker], covary = true)
# 1: :red, :circle
# 2: :blue, :rect
# 3: :green, :utriangle
# 4: :red, :dtriangle
# ...

Пример

with_theme(
    Theme(
        palette = (color = [:red, :blue], linestyle = [:dash, :dot]),
        Lines = (cycle = Cycle([:color, :linestyle], covary = true),)
    )) do
    lines(fill(5, 10))
    lines!(fill(4, 10))
    lines!(fill(3, 10))
    lines!(fill(2, 10))
    lines!(fill(1, 10))
    current_figure()
end
1585559

Циклический перебор вручную с помощью Cycled

Чтобы присвоить атрибуту графика определенное значение из соответствующего обработчика цикла, можно использовать объект Cycled. Индекс i, переданный в Cycled, используется непосредственно для поиска значения в обработчике цикла, принадлежащем атрибуту. Если такой обработчик цикла не определен, выдается ошибка. Например, для доступа к третьему цвету в обработчике цикла вместо построения трех графиков с целью продвижения обработчика цикла можно использовать color = Cycled(3).

Внутренний счетчик обработчика цикла не увеличивается при использовании Cycled для любого атрибута, и только атрибуты с Cycled получают доступ к перебираемым значениям. Все остальные обычно перебираемые атрибуты возвращаются к нециклическим значениям по умолчанию.

using CairoMakie
f = Figure()

Axis(f[1, 1])

# обычный цикл
lines!(0..10, x -> sin(x) - 1)
lines!(0..10, x -> sin(x) - 2)
lines!(0..10, x -> sin(x) - 3)

# цвета, указанные вручную
lines!(0..10, x -> sin(x) - 5, color = Cycled(3))
lines!(0..10, x -> sin(x) - 6, color = Cycled(2))
lines!(0..10, x -> sin(x) - 7, color = Cycled(1))

f
7272316

Палитры

Атрибуты, указанные в цикле, ищутся в палитре осей. Отдельное значение :color является как атрибутом графика, так и атрибутом палитры, тогда как :color => :patchcolor означает, что plot.color следует установить в palette.patchcolor. Вот пример, показывающий, как графики плотности реагируют на различные параметры палитры.

using CairoMakie

f = Figure(size = (800, 800))

Axis(f[1, 1], title = "Default cycle palette")

for i in 1:6
    density!(randn(50) .+ 2i)
end

Axis(f[2, 1],
    title = "Custom cycle palette",
    palette = (patchcolor = [:red, :green, :blue, :yellow, :orange, :pink],))

for i in 1:6
    density!(randn(50) .+ 2i)
end

set_theme!(Density = (cycle = [],))

Axis(f[3, 1], title = "No cycle")

for i in 1:6
    density!(randn(50) .+ 2i)
end


f
5103a47

Кроме того, темы можно применять к глобальным палитрам, например, так: set_theme!(palette = (color = my_colors, marker = my_markers)).

Специальные атрибуты

С помощью ключей rowgap и colgap можно изменять промежутки по умолчанию в сеточном макете.