Темы
|
Страница в процессе перевода. |
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()
Теперь определим тему, которая изменяет размер шрифта по умолчанию, активируем ее и построим график.
fontsize_theme = Theme(fontsize = 10)
set_theme!(fontsize_theme)
example_plot()
Эта тема будет активна до тех пор, пока мы не вызовем set_theme!().
set_theme!()
объединяем
Темы часто влияют только на часть атрибутов графика. Поэтому темы можно комбинировать, чтобы объединять соответствующие эффекты.
Например, темную тему можно объединить с темой шрифтов LaTeX, чтобы получить и темные цвета, и единообразные шрифты.
dark_latexfonts = merge(theme_dark(), theme_latexfonts())
with_theme(dark_latexfonts) do
example_plot()
end
update_theme!
Если вы уже активировали тему и хотите частично обновить ее, не удаляя атрибуты, отсутствующие в новой теме, можно воспользоваться функцией update_theme!.
Например, вы можете решить изменить размер текста после активации темной темы и темы LaTeX в предыдущем разделе.
update_theme!(fontsize=30)
example_plot()
with_theme
Чтобы вам не приходилось помнить о необходимости отключения тем, которые нужны только временно, существует функция with_theme(f, theme), которая выполняет сброс автоматически, даже если при выполнении f произошла ошибка.
with_theme(fontsize_theme) do
example_plot()
end
Вы также можете передать дополнительные именованные аргументы для добавления или переопределения атрибутов темы.
with_theme(fontsize_theme, fontsize = 25) do
example_plot()
end
Применение тем к объектам блоков
К любому блоку, например Axis, Legend, Colorbar и т. д., можно применить тему, используя имя его типа в качестве ключа в теме.
ggplot_theme = Theme(
Axis = (
backgroundcolor = :gray90,
leftspinevisible = false,
rightspinevisible = false,
bottomspinevisible = false,
topspinevisible = false,
xgridcolor = :white,
ygridcolor = :white,
)
)
with_theme(example_plot, ggplot_theme)
Циклы
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
Параллельные циклы
Создать объект 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
Циклический перебор вручную с помощью 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
Палитры
Атрибуты, указанные в цикле, ищутся в палитре осей. Отдельное значение :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
Кроме того, темы можно применять к глобальным палитрам, например, так: set_theme!(palette = (color = my_colors, marker = my_markers)).