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

Plots — мощный инструмент для визуализации в Julia

Автор: Томас Брелофф (Thomas Breloff) (@tbreloff)

Чтобы приступить к работе, ознакомьтесь с этим руководством.

Практически все задачи в Plots выполняются путем указания атрибутов графика.

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

Введение в Julia Plots

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

Plots представляет собой интерфейс и набор инструментов для визуализации. Он расположен поверх других бэкендов, таких как GR, PythonPlot, PGFPlotsX или Plotly, связывая команды с реализацией. Если один бэкенд не поддерживает нужные вам функции или не предоставляет разумные компромиссные варианты, вы можете просто переключиться на другой бэкенд, выполнив всего одну команду. Изменять код не требуется. Изучать новый синтаксис также не требуется. Plots может стать последним пакетом построения графиков, который вы когда-либо изучали.

Этот пакет обеспечивает следующие преимущества.

  • Эффективность. Делайте больше с меньшими затратами. Создание сложных визуализаций становится простым процессом.

  • Интуитивность. Начните строить графики без чтения томов документации. Команды должны просто работать.

  • Лаконичность. Меньший объем кода означает меньшее количество ошибок и более эффективную разработку и анализ.

  • Гибкость. Создавайте свои любимые графики из предпочитаемого пакета и делайте это быстрее и проще.

  • Согласованность. Не ограничивайтесь одним графическим пакетом. Используйте один и тот же код и получайте доступ к преимуществам всех бэкендов.

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

  • Интеллектуальность. Это не совсем AGI, но Plots должен понимать, что вы хотите, чтобы он сделал, а не только то, что вы говорите ему.

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

Добавляйте пожелания, ошибки или любые другие комментарии и вопросы в список проблем, а также присоединяйтесь к обсуждениям в zulip.

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


Простота прекрасна

Аттрактор Лоренца

using Plots
# определяет аттрактор Лоренца
Base.@kwdef mutable struct Lorenz
    dt::Float64 = 0.02
    σ::Float64 = 10
    ρ::Float64 = 28
    β::Float64 = 8/3
    x::Float64 = 1
    y::Float64 = 1
    z::Float64 = 1
end

function step!(l::Lorenz)
    dx = l.σ * (l.y - l.x)
    dy = l.x * (l.ρ - l.z) - l.y
    dz = l.x * l.y - l.β * l.z
    l.x += l.dt * dx
    l.y += l.dt * dy
    l.z += l.dt * dz
end

attractor = Lorenz()


# инициализирует трехмерный график одним пустым рядом
plt = plot3d(
    1,
    xlim = (-30, 30),
    ylim = (-30, 30),
    zlim = (0, 60),
    title = "Lorenz Attractor",
    legend = false,
    marker = 2,
)

# создает анимированный gif-файл, отправляя новые точки на график, сохраняя каждый 10-й кадр
@gif for i=1:1500
    step!(attractor)
    push!(plt, attractor.x, attractor.y, attractor.z)
end every 10
XcJABwweCOAcaQKcUIIDHBhgHmkjlKCBAh4YIMB+kQWAgAAjiCDAByFMh1cJJyzwAYWKFfCBBxx00EAAp4UQwFMJ2NdZfCAUFxAAOw==

Создание волн

using Plots
default(legend = false)
x = y = range(-5, 5, length = 40)
zs = zeros(0, 40)
n = 100

@gif for i in range(0, stop = 2π, length = n)
    f(x, y) = sin(x + 10sin(i)) + cos(y)

    # создает график с тремя подграфиками и пользовательским макетом
    l = @layout [a{0.7w} b; c{0.2h}]
    p = plot(x, y, f, st = [:surface, :contourf], layout = l)

    # вызывает небольшое колебание угла поворота камеры, в градусах (азимут, высота)
    plot!(p[1], camera = (10 * (1 + cos(i)), 40))

    # добавляет линию отслеживания
    fixed_x = zeros(40)
    z = map(f, fixed_x, y)
    plot!(p[1], fixed_x, y, z, line = (:black, 5, 0.2))
    vline!(p[2], [0], line = (:black, 5))

    # добавляет и показывает отслеживаемые значения с течением времени
    global zs = vcat(zs, z')
    plot!(p[3], zs, alpha = 0.2, palette = cgrad(:blues).colors)
end
uPmlWcJCAA7

Набор данных «Ирис»

# загружает набор данных
using RDatasets
iris = dataset("datasets", "iris");

# загружает инструкции StatsPlots (для DataFrames), доступные с помощью
# Pkg.add("StatsPlots")
using StatsPlots

# Диаграмма рассеяния с некоторыми пользовательскими настройками
@df iris scatter(
    :SepalLength,
    :SepalWidth,
    group = :Species,
    title = "My awesome plot",
    xlabel = "Length",
    ylabel = "Width",
    m = (0.5, [:cross :hex :star7], 12),
    bg = RGB(0.2, 0.2, 0.2)
)