Краткое руководство по Makie.jl

Приступая к изучению Julia, можно заблудиться во множестве различных пакетов, доступных для визуализации данных. Прямо из манжеты есть Plots, Gadfly, VegaLite… и есть Makie.

Makie довольно новый (~ 2018), но очень универсальный, активно развивается и быстро растет число пользователей. Эта статья представляет собой краткое введение в Маки, но к ее концу вы сможете создавать множество различных сюжетов.

Будущее заговора в Джулии

Когда я начал программировать в Джулии, Маки не входила в число претендентов на звание «лучшей» библиотеки для построения графиков. Со временем я все больше и больше слышал об этом в сообществе. Почему-то люди говорили, что:

«Маки — это будущее» — Люди в сообществе Джулии

Я никогда до конца не понимал, почему это так, и каждый раз, когда я пытался это выучить, меня отталкивал многословный синтаксис и, честно говоря, уродливые примеры. Только когда я наткнулся на Прекрасную Маки, я решил отбросить свои предубеждения и идти в ногу со временем.

Следовательно, если вы начинаете программировать в Julia и задаетесь вопросом, какой пакет для построения графиков вам следует потратить на изучение, я скажу вам, что Makie — это то, что вам нужно, поскольку я думаю, что «Makie — это будущее».

Начиная с Маки… Выберите свой бэкенд

Универсальность Makie может сделать его немного неприятным для тех, кто «просто хочет сделать чертову точечную диаграмму». В первую очередь это Makie.jl, CairoMakie.jl, GLMakie.jl WGLMakie.jl 😰. Какой из них вы должны использовать?

Ну, вот сделка. Makie.jl — это основной пакет для построения графиков, но вам нужно выбрать серверную часть, на которой вы будете отображать свои графики. Выбор зависит от ваших целей. Так что да, помимо Makie.jl, вам нужно будет установить один из бэкендов. Вот небольшое описание, которое поможет вам выбрать:

  • CairoMakie.jl: его проще всего использовать из всех трех, и это идеальный выбор, если вы просто хотите создавать статические графики (не интерактивные);
  • GLMakie.jl: использует OpenGL для отображения графиков, поэтому вам необходимо установить OpenGL. Как только вы сделаете график и запустите display(myplot) , откроется интерактивное окно с вашим графиком. Если вы хотите делать интерактивные 3D-графики, то этот бэкенд для вас;
  • WGLMakie.jl: С ним труднее всего работать. Тем не менее, если вы хотите создавать интерактивные визуализации в Интернете, это ваш выбор.

В этом руководстве мы будем использовать CairoMakie.jl.

Ваш первый сюжет

После выбора нашего бэкенда мы можем начать рисовать! Я рискну и скажу, что Makie очень похож на Matplotlib. Он не работает ни с какой причудливой Грамматикой графики (но если вам нравятся такие вещи, взгляните на AlgebraOfGraphics.jl, который реализует Алгебру графики на Маки).

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

using CairoMakie #Yeah, no need to import Makie
scatter(rand(10,2))

Легкий ветерок… Тем не менее, если вы рисуете это в блокноте Jupyter, вас могут немного смутить две вещи. Во-первых, изображение слишком большое. А во-вторых, это некачественно. Что происходит?

По умолчанию CairoMakie использует для изображений растровый формат, а размер по умолчанию немного великоват. Если вы похожи на меня и предпочитаете, чтобы ваши графики были в формате svg и немного меньше, то не беспокойтесь! Просто сделайте следующее:

using CairoMakie
CairoMakie.activate!(type = "svg")
scatter(rand(10,2),figure=(;resolution=(300,300)))

В приведенном выше коде CairoMakie.activate!() — это команда, которая сообщает Makie, какой бэкенд вы используете. Вы можете импортировать более одного бэкенда за раз и переключаться между ними с помощью этих команд активации. Кроме того, в бэкэнде CairoMakie есть возможность делать графики в формате svg (насколько мне известно, это невозможно для других бэкендов). Следовательно, с помощью этой небольшой строки кода все наши графики теперь будут отображаться в высоком качестве.

Затем мы определили «разрешение» для нашей фигуры. На мой взгляд, это немного неудачное имя, потому что resolution на самом деле является размером нашего изображения. Однако, как мы увидим дальше, атрибут resolution на самом деле принадлежит нашей фигуре, а не фактической диаграмме рассеивания. По этой причине мы передаем весь figure = (; resolution=(300,300))(если вы новичок в Julia, ; — это просто способ отделить атрибуты с именами от безымянных, т. е. args и kwags).

Поздравляю! Теперь вы знаете самый минимум Маки, чтобы сделать целую кучу разных сюжетов! Просто зайдите на веб-сайт Маки и узнайте, как использовать различные готовые функции построения графиков! Чтобы быть самодостаточным, вот небольшая шпаргалка из великой книги Julia Data Science.

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

Фигура, ось и график

Такие команды, как scatter, создают объект FigureAxisPlot, который содержит фигуру, набор осей и фактический график. Каждый из этих объектов имеет разные атрибуты и является фундаментальным для настройки визуализации. При выполнении:

fig, ax, plt = scatter(rand(10,2))

Мы сохраняем каждый из этих объектов в другой переменной и можем более легко изменять их. В этом примере функция scatter фактически создает все три объекта, а не только график. Вместо этого мы могли бы создать каждый из этих объектов по отдельности. Вот как мы это делаем:

fig = Figure(resolution=(600, 400)) 
ax = Axis(fig[1, 1], xlabel = "x label", ylabel = "y label",
    title = "Title")
lines!(ax, 1:0.1:10, x->sin(x))

Давайте объясним код выше. Сначала мы создали пустую фигуру и сохранили ее в fig. Далее мы создали «Ось». Но нам нужно сказать, какой фигуре принадлежит этот объект, и здесь появляется fig[1,1]. Но что это за «[1,1]»?

Каждая фигура в Makie имеет сетку внизу, что позволяет нам легко создавать подсюжеты на одной и той же фигуре. Следовательно, fig[1,1] означает «Ось принадлежит fig строке 1 и столбцу 1». Так как наша фигура состоит только из одного элемента, то наша ось будет занимать всю фигуру. Все еще в замешательстве? Не волнуйтесь, как только мы создадим подсюжеты, вы поймете, почему это так полезно.

Остальные аргументы в «Оси» понять несложно. Мы просто определяем имена на каждой оси, а затем название.

Наконец, мы добавляем график, используя lines!. Восклицательный знак — это стандарт в Джулии, который означает, что функция фактически изменяет объект. В нашем случае lines!(ax, 1:0.1:10, x->sin(x)) добавляет линейный график к оси ax.

Теперь понятно, как мы можем, например, добавить больше линейных графиков. Запустив тот же самый lines! , мы добавим больше графиков к нашей оси ax. В этом случае давайте также добавим легенду к нашему графику.

fig = Figure(resolution=(600, 400)) 
ax = Axis(fig[1, 1], xlabel = "x label", ylabel = "y label",
    title = "Title")
lines!(ax, 1:0.1:10, x->sin(x), label="sin")
stairs!(ax, 1:0.1:10, x->cos(x), label="cos", color=:black)
axislegend(ax)
#*Tip*: if you are using Jupyter and want to display your
#       visualization, you can do display(fig) or just write fig in
#       the end of the cell.

Хорошо, наши участки начинают выглядеть хорошо. Позвольте мне закончить этот раздел, говоря о подсюжетах. Как я уже сказал, здесь в игру вступает вся «fig[1,1]». Если бы вместо того, чтобы делать два графика на одной оси, мы хотели бы создать два параллельных графика на одном и том же рисунке, вот как бы мы это сделали.

fig = Figure(resolution=(600, 300)) 
ax1 = Axis(fig[1, 1], xlabel = "x label", ylabel = "y label",
    title = "Title1")
ax2 = Axis(fig[1, 2], xlabel = "x label", ylabel = "y label",
    title = "Title2")
lines!(ax1, 1:0.1:10, x->sin(x), label="sin")
stairs!(ax1, 1:0.1:10, x->cos(x), label="cos", color=:black)
density!(ax2, randn(100))
axislegend(ax)
save("figure.png", fig)

На этот раз на том же рисунке мы создали две оси, но первая находится в первой строке и первом столбце, а вторая — во втором столбце. Затем мы просто добавляем график к соответствующей оси. Наконец, мы сохраняем фигуру в формате «png».

Заключительные слова

Вот и все для этого урока. Конечно, есть о чем еще поговорить, поскольку мы коснулись только поверхности. У Маки есть потрясающие возможности с точки зрения анимации и гораздо больше атрибутов / объектов, с которыми можно играть, чтобы создавать действительно удивительные визуализации. Если вы хотите узнать больше, взгляните на Документацию Маки, она очень хороша. А еще в книге Julia Data Science есть глава только о Маки.

Рекомендации

Эта статья в значительной степени опирается на книгу Julia Data Science и собственную документацию Маки.

Сторополи, Хейзер и Алонсо (2021 г.). Юлия Data Science. https://juliadatascience.io. ISBN: 9798489859165.

Дэниш и Крумбигель, (2021). Makie.jl: Гибкая высокопроизводительная визуализация данных для Джулии. Journal of Open Source Software, 6(65), 3349, https://doi.org/10.21105/joss.03349