Знакомство с 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. Конечно, это не такая уж большая проблема, и я думаю, что возможности этой графической библиотеки определенно того стоят. Спасибо за чтение! Я, безусловно, рекомендую попробовать эту библиотеку!