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

Введение

В экосистеме Julia появилось множество фантастических решений для визуализации данных. Несмотря на это, многие пользователи часто используют Plots.jl. Хотя Plots.jl, безусловно, классный пакет, важно помнить, что все, что пакет может предложить, - это три отдельных порта различного программного обеспечения с других языков программирования. Это порты Plot.ly, Matplotlib.pyplot и GR. По умолчанию Plots.jl использует библиотеку визуализации GR, которая является отличной библиотекой, но во многих отношениях очень безликой. Кроме того, использование таких портов действительно сокращает время предварительной компиляции и может снизить производительность Джулии при использовании таких пакетов, как PyCall. Как ни странно, у меня действительно есть полноценный учебник по GR-бэкэнду Plots.jl, если вам интересно:



Есть и другие чисто юлианские решения, родившиеся из дерева. На мой взгляд, самым ярким примером этого является пакет Gadfly. Пакет Gadfly обладает интерактивностью, которая не совсем соответствует чему-то вроде Plot.ly, но, безусловно, достаточна для большинства случаев. Вдобавок ко всему, с визуализацией Овод легко работать, и они просто хорошо выглядят! Я также написал руководство и обзор использования этого пакета, которые вы можете проверить здесь, если вам интересно:



Есть еще одна отличная библиотека визуализации, написанная на Julia, под названием Vegalite.jl. Я встречал много других ученых, которые клялись, что это лучший в Джулии, но я по-прежнему предпочитаю Gadfly.jl. Это потому, что я считаю Gadfly намного проще в использовании. У Vegalite странная методология, которая предполагает использование множества массивов для различных настроек на ваших графиках, а не аргументов. При этом я скажу, что Vegalite действительно имеет некоторые серьезные статистические визуализации под капотом по сравнению с другими вариантами в списке. Я фактически сравнил все три варианта, упомянутые в другой статье, которую вы можете проверить, если хотите, здесь:



Приятно иметь все эти статьи с дополнительной информацией, на которую можно ссылаться.

Еще одно недавнее дополнение к языку Julia и его возможностям построения графиков - это официальный порт пакета Plot.ly на этот язык. Должен признаться, у меня не было возможности опробовать этот вариант, но я взволнован, чтобы окунуться в него, и я мог бы даже написать об этом статью и сравнить ее с реализацией Python!

Со всеми этими графическими библиотеками в экосистеме я действительно хотел прикоснуться ко всем из них, чтобы как публично сравнить все доступные варианты, так и выяснить, какую из них я хочу использовать. Приятно знать многие из них, потому что я думаю, что все они, безусловно, имеют свои собственные функции. В этом путешествии по графическим библиотекам Джулиана я теперь остановлюсь на Makie.jl. Makie.jl немного уникален, потому что существует несколько реализаций библиотеки с использованием разных графических библиотек. Например, я решил использовать OpenGL, поэтому собираюсь добавить MakieGL.jl через Pkg. Существует также версия webgl и версия Cairo, WGLMakie.jl и CairoMakie.jl соответственно. Давайте продолжим, добавим пакет и приступим!

"ноутбук"

julia > ]
pkg > add GLMakie

Основные сюжеты

Поскольку я фактически никогда не использовал пакет Makie.jl, я решил немного познакомиться с некоторыми основными сюжетами. Makie.jl следует типичному высокоуровневому соглашению для графических библиотек, поэтому, к счастью, здесь не будет никаких шаров кривой Vegalite-esc.

using GLMakie

Как и в случае с Plots.jl, я заметил, что Маки очень долго прекомпилирует. Это могло быть потому, что я решил использовать OpenGL, но я сомневаюсь, что это так. Я имею в виду, что это действительно заняло много времени. Не слишком важно, но определенно то, что вы, возможно, захотите иметь в виду при использовании пакета с вашими приложениями. Первое, что я нарисовал, - это пример, взятый прямо из документации Маки:

points = [Point2f0(cos(t), sin(t)) for t in LinRange(0, 2pi, 20)] colors = 1:20 
figure, axis, scatterobject = scatter(points, color = colors, markersize = 15) 
figure

Похоже, не удалось загрузить драйвер OpenGL! Хорошая новость заключается в том, что я точно знаю, что Cairo отлично работает с моей установкой Julia на моем компьютере, поэтому мы переключимся на CairoMakie и ДОЛЖНЫ ПРОВЕРИТЬ ЭТО СНОВА.

julia > ]
pkg > add CairoMakie
using CairoMakie
points = [Point2f0(cos(t), sin(t)) for t in LinRange(0, 2pi, 20)]
colors = 1:20
figure, axis, scatterobject = scatter(points, color = colors, markersize = 15)
figure

Ура!

Мне действительно нравится, как эта библиотека работает, хотя это минималистичная визуализация, похожая на визуализацию чего-то вроде GR без интерактивности, это почти все, что мне нужно в большинстве ситуаций. Типы изменяемы, поэтому теперь мы можем изменить данные внутри этой структуры, чтобы получить другой результат. Еще более круто то, что мы можем добавить к этой фигуре цифры! Это действительно напомнило мне много лет назад созданную графическую библиотеку. Это было действительно круто, потому что он был метапрограммирован и объектно-ориентирован, но с тех пор проект был прекращен. На самом деле я писал об этом в Towards Data Science, так что, если вам случится заинтересоваться этим проектом, в нем много очень-очень интересной Джулии, вы можете проверить это здесь:



В этой серии много разных частей, поэтому, возможно, стоит ее прочитать, если вы действительно заинтересованы в пакете и коде, стоящем за ним. В любом случае, судя по моей истории разработки, я большой поклонник модульных вещей с моими графиками, и Makie.jl предлагает именно это! Это быстро становится моей новой любимой графической библиотекой. Мы можем добавить практически любую новую фигуру к нашей фигуре, используя! версия скаттера! метод.

circlefunc = ts -> 1.5 .* Point2f0.(cos.(ts), sin.(ts))
scatter!(circlefunc, LinRange(0, 2pi, 30), color = :red)
figure

Макеты

Makie.jl также имеет довольно надежную реализацию макетов. Их гораздо легче понять и они лучше сделаны, чем аналог GR, проверьте это! Мы можем создать полностью пустую фигуру и добавить на нее все модульные части нашей визуализации!

fig = Figure(resolution = (700, 500), backgroundcolor = RGBf0(0.98, 0.98, 0.98))
ax1 = fig[1, 1] = Axis(fig, title = "Pre Treatment")
data1 = randn(50, 2) * [1 2.5; 2.5 1] .+ [10 10]
line1 = lines!(ax1, 5..15, x -> x, color = :red, linewidth = 2)
scat1 = scatter!(ax1, data1,
    color = (:red, 0.3), markersize = 15px, marker = '■')
fig.layout
ax2, line2 = lines(fig[1, 2], 7..17, x -> -x + 26,
    color = :blue, linewidth = 4,
    axis = (title = "Post Treatment",))
fig

Анимации

В дополнение к предыдущим УДИВИТЕЛЬНЫМ и хорошо реализованным функциям Makie.jl также поддерживает анимацию! Я искренне взволнован, я уже знаю, что буду использовать эту библиотеку постоянно! Я уже так счастлив, что попробовал это, и анимация - это просто глазурь на торт, который уже настолько влажный, что тает во рту. Для создания анимированного сюжета нам также потребуется добавить пакет «AbstractPlots».

julia > ]
pkg > add AbstractPlots

И я собираюсь попробовать это. Чтобы действительно создать анимацию, мы будем использовать метод record (). Это фактически выведет его в видеофайл. Это немного странно, так как я, конечно, предпочел бы GIF или что-то в этом роде, но, тем не менее, это сработает.

using GLMakie 
using AbstractPlotting.Colors
figure, ax, lineplot = lines(0..10, sin; linewidth=10)
n_frames = 30 
framerate = 30 
hue_iterator = LinRange(0, 360, n_frames)  
record(figure, "color_animation.mp4", hue_iterator; framerate = framerate)
 do hue     lineplot.color = HSV(hue, 1, 0.75) end

Или, может быть, это не сработает.

Вывод

Я уверен, что со временем и усилиями обязательно найдется способ загрузить нужные драйверы и заставить мою систему работать с полной мощностью Makie.jl. Несмотря на трудности с анимацией, я очень рад начать использовать эту графическую библиотеку постоянно! Его модульная природа и необработанные возможности - это именно то, что я ищу в чем-то вроде этого. Я действительно рад, что попробовал это, теперь я действительно невероятно взволнован этим пакетом. Я очень рекомендую это. Худшая часть этого пакета, я бы сказал, вероятно, сегментированная природа пакетов, вам нужно будет добавить довольно много пакетов с помощью Pkg. Конечно, это не такая уж большая проблема, и я думаю, что возможности этой графической библиотеки определенно того стоят. Спасибо за чтение! Я, безусловно, рекомендую попробовать эту библиотеку!