Макеты
Начиная с версии 0.7.0 Plots поддерживает позиционирование подграфиков, позволяя создавать сложные, вложенные сетки подграфиков и компонентов. При этом были приняты меры по сохранению гибкости и универсальности платформы, так что бэкендам достаточно поддерживать возможность точного определения абсолютной позиции подграфика, и они получают все возможности вложенности, выравнивания областей графика и т. д. Просто задайте ключевое слово layout
в вызове plot(...)
.
На этом этапе полезно ознакомиться с терминологией.
-
График (Plot): целая фигура/окно.
-
Подграфик (Subplot): один подграфик, содержащий название, оси, панель цветов, условные обозначения и область построения.
-
Ось (Axis): одна ось подграфика, содержащая направляющую оси (метку), подписи делений и метки делений.
-
Область построения (Plot Area): часть подграфика, в которой отображаются данные. Содержит ряды, линии сетки и т. д.
-
Ряды (Series): отдельная визуализация данных (например, линия или набор маркеров).
Простые макеты
Передача целого числа макету (layout
), чтобы он автоматически вычислил размер сетки для этого количества подграфиков:
# создает сетку 2x2 и сопоставляет каждый из 4 рядов с одним из подграфиков
plot(rand(100, 4), layout = 4)
Передача кортежа макету (layout
), чтобы создать сетку этого размера:
# создает сетку 4x1 и сопоставляет каждый из 4 рядов с одним из подграфиков
plot(rand(100, 4), layout = (4, 1))
Более сложные макеты сетки можно создать с помощью конструктора grid(...)
:
plot(rand(100, 4), layout = grid(4, 1, heights=[0.1 ,0.4, 0.4, 0.1]))
Можно легко добавить названия и подписи:
plot(rand(100,4), layout = 4, label=["a" "b" "c" "d"],
title=["1" "2" "3" "4"])
Расширенные макеты
Макрос @layout
является самым простым способом определения сложных макетов, использующим построение многомерных массивов Julia в качестве основы для пользовательского синтаксиса макета. Точный размер можно получить с помощью фигурных скобок, в противном случае свободное пространство равномерно распределяется между областями построения подграфиков.
Сами символы (a
и b
в примере ниже) могут быть любыми допустимыми идентификаторами и не имеют никакого особого значения.
l = @layout [
a{0.3w} [grid(3,3)
b{0.2h} ]
]
plot(
rand(10, 11),
layout = l, legend = false, seriestype = [:bar :scatter :path],
title = ["($i)" for j in 1:1, i in 1:11], titleloc = :right, titlefont = font(8)
)
С помощью атрибута inset_subplots
можно создавать вставные (плавающие) подграфики. inset_subplots
принимает список кортежей (parent_layout, BoundingBox), в котором ограничивающий прямоугольник задается относительно родительского элемента.
Используйте px
/mm
/inch
для абсолютных координат, w
/h
— для процентных значений относительно родительского элемента. Источник — левый верхний угол. h_anchor
/v_anchor
определяют, к чему относятся входные данные x
/y
ограничивающего прямоугольника.
# коробчатая диаграмма (boxplot) определяется в StatsPlots
using StatsPlots, StatsPlots.PlotMeasures
gr(leg = false, bg = :lightgrey)
# Создать заполненный контур и коробчатую диаграмму рядом друг с другом.
plot(contourf(randn(10, 20)), boxplot(rand(1:4, 1000), randn(1000)))
# Добавить гистограмму на тепловую карту.
# Мы задаем (необязательно) положение относительно правого нижнего края 1-го подграфика.
# Вызов имеет вид `bbox(x, y, width, height, origin...)`, где числа рассматриваются как
# «процент от родителя».
histogram!(
randn(1000),
inset = (1, bbox(0.05, 0.05, 0.5, 0.25, :bottom, :right)),
ticks = nothing,
subplot = 3,
bg_inside = nothing
)
# Добавить столбики, плавающие в окне (вставка относительно окна, в отличие от вставки
# относительно подграфика)
sticks!(
randn(100),
inset = bbox(0, -0.2, 200px, 100px, :center),
ticks = nothing,
subplot = 4
)