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

Макеты

Начиная с версии 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
)

Поэтапное добавление подграфиков

Несколько графиков можно объединить в один. Для этого достаточно передать функции plot переменные, содержащие предыдущие графики:

l = @layout [a ; b c]
p1 = plot(...)
p2 = plot(...)
p3 = plot(...)
plot(p1, p2, p3, layout = l)

Игнорирование графиков в макете

С помощью символа _ (подчеркивание) можно игнорировать графики в макете (пустые графики):

plot((plot() for i in 1:7)..., layout=@layout([_ ° _; ° ° °; ° ° °]))