Цвета
|
Страница в процессе перевода. |
В 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
Памятка
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
Именованные цвета
Именованные цвета (например, :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
Вот список всех цветовых карт, доступных посредством Symbol в Makie, которые определены в ColorSchemes.jl: