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

Заключение в оболочку существующих шаблонов для новых типов

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

Введение

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

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

Для определения шаблонов достаточно использовать MakieCore.jl, что особенно удобно, когда вы являетесь разработчиком пакетов и хотите избежать зависимости от полного Makie.jl. В целях демонстрации в этом руководстве мы будем использовать CairoMakie.jl для визуализации действий по ходу процесса.

using MakieCore, CairoMakie

struct MyHist
    bincounts
    bincenters
end

Целевым типом является MyHist, который имеет два поля, как определено выше. Если не вдаваться в подробности, при создании гистограмм мы говорим о построении столбчатого графика, где bincenters указывает места для построения этих столбцов, а bincounts сообщает о высоте каждого из них.

Шаблон BarPlot — расширение Makie.convert_arguments

Первым шаблоном, строить который мы научим Makie, будет BarPlot(). Как уже говорилось, два поля, которые присутствуют в MyHist, в основном указывают, как его строить в виде BarPlot. Makie предлагает следующий метод для такого типа настройки.

Makie.convert_arguments(P::Type{<:BarPlot}, h::MyHist) = convert_arguments(P, h.bincenters, h.bincounts)

h = MyHist([1, 10, 100], 1:3)

barplot(h)
c8d56cd

Шаблон Hist — переопределение Makie.plot!

Вторым шаблоном, который мы хотим настроить для типа MyHist, является шаблон Hist(). Этого нельзя добиться с помощью convert_arguments, как мы сделали это для BarPlot(), так как обычно Makie.hist() принимает в качестве входных необработанные данные, а у нас уже есть сгруппированные данные в типе MyHist.

Первое, что можно попробовать, — переопределить метод plot! для шаблона Hist.

function Makie.plot!(plot::Hist{<:Tuple{<:MyHist}})
    barplot!(plot, plot[1])
    plot
end
h = MyHist([1, 10, 100], 1:3)
hist(h; color=:red, direction=:x)
59ed58f

Этот вариант почти работает, но мы видим, что именованные аргументы не передаются функции barplot!. Для корректной обработки этих атрибутов нужно переопределить или объединить атрибуты по умолчанию базового типа графика (в данном случае BarPlot) с атрибутами, передаваемыми пользователем. Начиная с Makie версии 0.21, для этого случая был введен shared_attributes, который извлекает все допустимые атрибуты для целевого типа графика.

function Makie.plot!(plot::Hist{<:Tuple{<:MyHist}})
    # Передавать только допустимые атрибуты для BarPlot
    valid_attributes = Makie.shared_attributes(plot, BarPlot)
    barplot!(plot, valid_attributes, plot[1])
end
h = MyHist([1, 10, 100], 1:3)
hist(h; color=:red, direction=:x)
a347850