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

Цвета

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

В Makie есть несколько способов указать цвета. Большинство объектов графиков позволяют передавать массив в качестве атрибута color. Число цветовых элементов в нем должно совпадать с числом визуальных элементов (маркеров рассеяния, отрезков, многоугольников и т. д.). В качестве альтернативы можно передать один цветовой элемент, который будет применен сразу к всем визуальным элементам.

При передаче массива чисел или одного числа значения конвертируются в цвета с помощью атрибутов colormap и colorrange. По умолчанию colorrange охватывает диапазон значений цвета, но его можно зафиксировать вручную. Например, это может быть полезно для выбора категориальных цветов. Например, для числа 1 выбирается первый, а для числа 2 — второй цвет из 10-цветной категориальной карты :tab10, если атрибут colorrange установлен равным (1, 10).

Значения NaN обычно отображаются цветом :transparent, поэтому они невидимы. Это можно изменить с помощью атрибута nan_color.

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

Альфа-значение или непрозрачность

В большинстве графиков Makie можно использовать именованный аргумент alpha.

В качестве альтернативы можно создать частично прозрачные цвета или цветовые карты, передав кортеж (color, alpha) в атрибут color или colormap.

Текстуры, узоры и MatCap

Некоторые типы графиков (например, mesh, surface и т. д.) позволяют выбирать образцы цветов из изображения. Выборка может осуществляться на основе координат текстуры (координат uv), пиксельных координат или нормалей.

Первый вариант применяется, когда Matrix изображения передается непосредственно как атрибут color. Обратите внимание, что для получения четко определенного результата должны быть доступны координаты текстуры.

Второй вариант применяется, когда Makie.AbstractPattern передается как атрибут color. Обычно это используется для штриховки. Например, узор штриховки с диагональными линиями можно задать с помощью color = Pattern('/'). В более общем случае можно определить штриховый узор с помощью Makie.LinePattern() или использовать изображение в качестве узора с помощью Pattern(image).

Последний вариант применяется, когда изображение передается с атрибутом matcap. Затем изображение интерпретируется как располагающееся от (--1, 1) до (1, 1), чтобы позволяет сопоставить с ним нормали. Направление нормали (0,0,1) обращено к камере/зрителю.

using GLMakie
using GLMakie, FileIO

f = Figure()

mesh(f[1, 1], Rect2f(0,0,1,1), color = load(Makie.assetpath("cow.png")), shading = NoShading, axis=(title ="texture",))
mesh(f[2, 1], Rect2f(0,0,1,1), color = Pattern('/'), shading = NoShading, axis=(title ="Pattern",))

hidedecorations!.(f.content)

catmesh = FileIO.load(assetpath("cat.obj"))
texture = FileIO.load(assetpath("diffusemap.png"))
matcap = FileIO.load(Base.download("https://raw.githubusercontent.com/nidorx/matcaps/master/1024/E6BF3C_5A4719_977726_FCFC82.png"))

Label(f[1, 2][1, 1], "texture 3D", tellwidth = false)
a, p = mesh(f[1, 2][2, 1], catmesh, color = texture, axis = (show_axis = false, ))
Label(f[2, 2][1, 1], "matcap", tellwidth = false)
mesh(f[2, 2][2, 1], catmesh, matcap = matcap, shading = NoShading, axis = (show_axis = false, ))

f
4eea6cc

Памятка

Вот небольшая памятка с распространенными спецификациями цветов:

using CairoMakie
using Makie.Colors

theme = Attributes(
    Scatter = (; markersize = 40),
    Text = (; align = (:center, :bottom), offset = (0, 30))
)

with_theme(theme) do

    f = Figure(size = (800, 1200))
    ax = Axis(f[1, 1], xautolimitmargin = (0.2, 0.2), yautolimitmargin = (0.1, 0.1))
    hidedecorations!(ax)
    hidespines!(ax)

    scatter!(ax, 1, 1, color = :red)
    text!(ax, 1, 1, text = ":red")

    scatter!(ax, 2, 1, color = (:red, 0.5))
    text!(ax, 2, 1, text = "(:red, 0.5)")

    scatter!(ax, 3, 1, color = RGBf(0.5, 0.2, 0.8))
    text!(ax, 3, 1, text = "RGBf(0.5, 0.2, 0.8)")

    scatter!(ax, 4, 1, color = RGBAf(0.5, 0.2, 0.8, 0.5))
    text!(ax, 4, 1, text = "RGBAf(0.5, 0.2, 0.8, 0.5)")

    scatter!(ax, 1, 0, color = Colors.HSV(40, 30, 60))
    text!(ax, 1, 0, text = "Colors.HSV(40, 30, 60)")

    scatter!(ax, 2, 0, color = 1, colormap = :tab10, colorrange = (1, 10))
    text!(ax, 2, 0, text = "color = 1\ncolormap = :tab10\ncolorrange = (1, 10)")

    scatter!(ax, 3, 0, color = 2, colormap = :tab10, colorrange = (1, 10))
    text!(ax, 3, 0, text = "color = 2\ncolormap = :tab10\ncolorrange = (1, 10)")

    scatter!(ax, 4, 0, color = 3, colormap = :tab10, colorrange = (1, 10))
    text!(ax, 4, 0, text = "color = 3\ncolormap = :tab10\ncolorrange = (1, 10)")

    text!(ax, 2.5, -1, text = "color = 1:10\ncolormap = :viridis\ncolorrange = automatic")
    scatter!(ax, range(1, 4, length = 10), fill(-1, 10), color = 1:10, colormap = :viridis)

    text!(ax, 2.5, -2, text = "color = [1, 2, 3, 4, NaN, 6, 7, 8, 9, 10]\ncolormap = :viridis\ncolorrange = (2, 9)")
    scatter!(ax, range(1, 4, length = 10), fill(-2, 10), color = [1, 2, 3, 4, NaN, 6, 7, 8, 9, 10], colormap = :viridis, colorrange = (2, 9))

    text!(ax, 2.5, -3, text = "color = [1, 2, 3, 4, NaN, 6, 7, 8, 9, 10]\ncolormap = :viridis\ncolorrange = (2, 9)\nnan_color = :red, highclip = :magenta, lowclip = :cyan")
    scatter!(ax, range(1, 4, length = 10), fill(-3, 10), color = [1, 2, 3, 4, NaN, 6, 7, 8, 9, 10], colormap = :viridis, colorrange = (2, 9), nan_color = :red, highclip = :magenta, lowclip = :cyan)

    text!(ax, 2.5, -4, text = "color = HSV.(range(0, 360, 10), 50, 50)")
    scatter!(ax, range(1, 4, length = 10), fill(-4, 10), color = HSV.(range(0, 360, 10), 50, 50))

    text!(ax, 2.5, -5, text = "color = 1:10\ncolormap = (:viridis, 0.5)\ncolorrange = automatic")
    scatter!(ax, range(1, 4, length = 10), fill(-5, 10), color = 1:10, colormap = (:viridis, 0.5))

    text!(ax, 2.5, -6, text = "color = 1:10\ncolormap = [:red, :orange, :brown]\ncolorrange = automatic")
    scatter!(ax, range(1, 4, length = 10), fill(-6, 10), color = 1:10, colormap = [:red, :orange, :brown])

    text!(ax, 2.5, -7, text = "color = 1:10\ncolormap = Reverse(:viridis)\ncolorrange = automatic")
    scatter!(ax, range(1, 4, length = 10), fill(-7, 10), color = 1:10, colormap = Reverse(:viridis))

    f
end
398c28a

Именованные цвета

Именованные цвета (например, :blue) анализируются в Makie.jl с помощью пакета Colors.jl и, таким образом, имеют большой набор возможностей в соответствии со спецификациями CSS. Таблицу всех возможных имен можно найти на этой странице.

Цветовые карты

Стандартная палитра категориальных цветов Makie, используемая для циклического перебора, представляет собой переупорядоченную версию палитры, представленной в работе Вонга (Wong, 2011).

По умолчанию в Makie используется непрерывная цветовая карта :viridis, которая представляет собой зрительно однородную цветовую карту, изначально разработанную для matplotlib.

using CairoMakie
f, ax, sc = scatter(1:7, fill(1, 7), color = Makie.wong_colors(), markersize = 50)
hidedecorations!(ax)
hidespines!(ax)
text!(ax, 4, 1, text = "Makie.wong_colors()",
    align = (:center, :bottom), offset = (0, 30))
scatter!(range(1, 7, 20), fill(0, 20), color = 1:20, markersize = 50)
text!(ax, 4, 0, text = ":viridis",
    align = (:center, :bottom), offset = (0, 30))
ylims!(ax, -1, 2)
f
de4af11

Вот список всех цветовых карт, доступных посредством Symbol в Makie, которые определены в ColorSchemes.jl:

Прочее

Эти цветовые схемы не определены или предоставляют другие цвета в ColorSchemes.jl. Они оставлены для совместимости с Makie до версии 0.10.

cmocean

scientific

matplotlib

colorbrewer

gnuplot

colorcet

seaborn

general