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

scatter

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

scatter(positions)
scatter(x, y)
scatter(x, y, z)

Строит маркер для каждого элемента в (x, y, z), (x, y) или positions.

Тип графика

Псевдоним типа графика для функции scatter — Scatter.

Примеры

Использование векторов x и y

Для построения графиков рассеяния можно передать список координат x и y.

using CairoMakie
xs = range(0, 10, length = 30)
ys = 0.5 .* sin.(xs)

scatter(xs, ys)
3b7adf6

Использование точек

Также можно передать координаты в виде вектора точек, что предпочтительнее, если координаты должны быть обновлены позже, чтобы избежать разной длины x и y.

Такие атрибуты, как color и markersize, могут быть заданы в скалярной или векторной форме. Если передается вектор чисел для color, атрибут colorrange, который по умолчанию автоматически равен экстремуму значений цвета, решает, как искать цвета в colormap.

using CairoMakie
xs = range(0, 10, length = 30)
ys = 0.5 .* sin.(xs)
points = Point2f.(xs, ys)

scatter(points, color = 1:30, markersize = range(5, 30, length = 30),
    colormap = :thermal)
5d3d52c

Маркеры

Существует несколько различных категорий маркеров, которые можно использовать с scatter.

  • Char, такие как или . Глифы принимаются из шрифта Makie по умолчанию TeX Gyre Heros Makie.

  • Объекты BezierPath, которые можно использовать для создания пользовательских форм маркеров. Большинство маркеров по умолчанию, доступ к которым осуществляется через символ, например :circle или :rect, преобразуются в BezierPath на внутреннем уровне.

  • Polygon, которые эквивалентны построению BezierPath исключительно из команд LineTo.

  • Объекты Matrix{<:Colorant}, которые строятся в виде рассеяний изображений.

  • Специальные маркеры, такие как Circle и Rect, которые имеют собственную реализацию в бэкенде и могут отображаться быстрее.

Маркеры по умолчанию

Далее приведен пример графика, отображающего различные фигуры, доступные через символы (Symbol), а также несколько символов.

using CairoMakie
markers_labels = [
    (:circle, ":circle"),
    (:rect, ":rect"),
    (:diamond, ":diamond"),
    (:hexagon, ":hexagon"),
    (:cross, ":cross"),
    (:xcross, ":xcross"),
    (:utriangle, ":utriangle"),
    (:dtriangle, ":dtriangle"),
    (:ltriangle, ":ltriangle"),
    (:rtriangle, ":rtriangle"),
    (:pentagon, ":pentagon"),
    (:star4, ":star4"),
    (:star5, ":star5"),
    (:star6, ":star6"),
    (:star8, ":star8"),
    (:vline, ":vline"),
    (:hline, ":hline"),
    ('a', "'a'"),
    ('B', "'B'"),
    ('↑', "'\\uparrow'"),
    ('😄', "'\\:smile:'"),
    ('✈', "'\\:airplane:'"),
]

f = Figure()
ax = Axis(f[1, 1], yreversed = true,
    xautolimitmargin = (0.15, 0.15),
    yautolimitmargin = (0.15, 0.15)
)
hidedecorations!(ax)

for (i, (marker, label)) in enumerate(markers_labels)
    p = Point2f(fldmod1(i, 6)...)

    scatter!(p, marker = marker, markersize = 20, color = :black)
    text!(p, text = label, color = :gray70, offset = (0, 20),
        align = (:center, :bottom))
end

f
842c055

Атрибут markersize

Атрибут markersize масштабирует размер рассеяния относительно базового размера маркера рассеяния. Поэтому понятие атрибута markersize не связано напрямую с такой единицей, как px, оно зависит от того, что масштабируется.

Для маркеров Char атрибут markersize эквивалентен размеру шрифта при отображении тех же символов с помощью text.

using CairoMakie
f, ax, sc = scatter(1, 1, marker = 'A', markersize = 50)
text!(2, 1, text = "A", fontsize = 50, align = (:center, :center))
xlims!(ax, -1, 4)
f
8ad9e74

Маркеры по умолчанию BezierPath, такие как :circle, :rect, :utriangle и т. д., были выбраны таким образом, чтобы примерно соответствовать маркерам Char того же размера. Поэтому можно легко заменять маркеры без существенного изменения общего вида. Однако у маркеров Char и BezierPath разная высота или ширина markersize. Представим этот момент наглядно, построив Char, BezierPath, Circle и Rect перед линией шириной 50. Видно, что только специальные маркеры Circle и Rect соответствуют ширине линии, поскольку их базовый размер составляет 1 x 1, однако они не полностью совпадают с Char и BezierPath.

using CairoMakie
f, ax, l = lines([0, 1], [1, 1], linewidth = 50, color = :gray80)
for (marker, x) in zip(['X', 'x', :circle, :rect, :utriangle, Circle, Rect], range(0.1, 0.9, length = 7))
    scatter!(ax, x, 1, marker = marker, markersize = 50, color = :black)
end
f
513b7e3

Если требуется маркер, имеющий точный базовый размер, позволяющий сопоставлять его с линиями или другими объектами графика известного размера, или вы хотите использовать маркер в пространстве данных, можно сконструировать такой маркер самостоятельно, используя BezierPath или Polygon. Маркер с базовым размером 1 x 1, например, будет масштабироваться как lines, если markersize и linewidth одинаковы, так же как и маркеры Circle и Rect.

Далее мы строим шестиугольник с радиусом 1, который затем можно использовать для создания плитки поверхности в координатах данных, задав markerspace = :data.

using CairoMakie
hexagon = Makie.Polygon([Point2f(cos(a), sin(a)) for a in range(1/6 * pi, 13/6 * pi, length = 7)])

points = Point2f[(0, 0), (sqrt(3), 0), (sqrt(3)/2, 1.5)]

scatter(points,
    marker = hexagon,
    markersize = 1,
    markerspace = :data,
    color = 1:3,
    axis = (; aspect = 1, limits = (-2, 4, -2, 4)))
651a7fd

Маркеры пути Безье

Пути Безье лежат в основе векторных графических форматов, таких как SVG и PDF, и состоят из нескольких различных операций, которые позволяют определять сложные фигуры.

В BezierPath содержится вектор команд пути. Вот они: MoveTo, LineTo, CurveTo, EllipticalArc и ClosePath. Заполненная фигура должна начинаться с MoveTo и заканчиваться ClosePath.

Note Незаполненные маркеры (например, одиночная линия или кривая) поддерживаются в CairoMakie, но не в GLMakie и WGLMakie, поскольку эти бэкенды должны сначала отрисовать маркер как заполненную фигуру на текстуре. Если отрисовка заполнения невозможна, маркер будет невидимым. CairoMakie, в свою очередь, без проблем отображает контуры таких маркеров.

Вот пример с простой стрелкой, центрированной по наконечнику и построенной из элементов пути.

using CairoMakie
arrow_path = BezierPath([
    MoveTo(Point(0, 0)),
    LineTo(Point(0.3, -0.3)),
    LineTo(Point(0.15, -0.3)),
    LineTo(Point(0.3, -1)),
    LineTo(Point(0, -0.9)),
    LineTo(Point(-0.3, -1)),
    LineTo(Point(-0.15, -0.3)),
    LineTo(Point(-0.3, -0.3)),
    ClosePath()
])

scatter(1:5,
    marker = arrow_path,
    markersize = range(20, 50, length = 5),
    rotation = range(0, 2pi, length = 6)[1:end-1],
)
c74ef8a

Отверстия

Пути могут иметь отверстия — просто начните новый подпуть с MoveTo, который находится внутри основного пути. Отверстия должны быть расположены по часовой стрелке, если внешняя сторона расположена против часовой стрелки, или наоборот. Например, круг с вырезанным квадратом может быть образован одним EllipticalArc, который идет против часовой стрелки, и квадратом внутри, который идет по часовой стрелке:

using CairoMakie
circle_with_hole = BezierPath([
    MoveTo(Point(1, 0)),
    EllipticalArc(Point(0, 0), 1, 1, 0, 0, 2pi),
    MoveTo(Point(0.5, 0.5)),
    LineTo(Point(0.5, -0.5)),
    LineTo(Point(-0.5, -0.5)),
    LineTo(Point(-0.5, 0.5)),
    ClosePath(),
])

scatter(1:5,
    marker = circle_with_hole,
    markersize = 30,
)
216b537

Построение из строк SVG-путей

Путь Безье можно создать из из строки спецификации SVG-пути. С помощью ключевых слов fit, flipy и flipx можно автоматически изменять размер пути и менять направление осей y и x (в SVG обычно используется система координат, в которой y увеличивается вниз). По умолчанию ограничивающий прямоугольник для подогнанного пути представляет собой квадрат шириной 1 с центром в нуле. С помощью именованного аргумента bbox можно передать другой ограничивающий Rect. По умолчанию аспект пути остается нетронутым, а если он не совпадает с новым ограничивающим прямоугольником, путь центрируется так, чтобы он располагался внутри. Установите keep_aspect = false, чтобы поместить путь в ограничивающий прямоугольник, не учитывая его исходное соотношение сторон.

Вот пример с SVG-строкой, содержащий символ летучей мыши:

using CairoMakie
batsymbol_string = "M96.84 141.998c-4.947-23.457-20.359-32.211-25.862-13.887-11.822-22.963-37.961-16.135-22.041 6.289-3.005-1.295-5.872-2.682-8.538-4.191-8.646-5.318-15.259-11.314-19.774-17.586-3.237-5.07-4.994-10.541-4.994-16.229 0-19.774 21.115-36.758 50.861-43.694.446-.078.909-.154 1.372-.231-22.657 30.039 9.386 50.985 15.258 24.645l2.528-24.367 5.086 6.52H103.205l5.07-6.52 2.543 24.367c5.842 26.278 37.746 5.502 15.414-24.429 29.777 6.951 50.891 23.936 50.891 43.709 0 15.136-12.406 28.651-31.609 37.267 14.842-21.822-10.867-28.266-22.549-5.549-5.502-18.325-21.147-9.341-26.125 13.886z"

batsymbol = BezierPath(batsymbol_string, fit = true, flipy = true)

scatter(1:10, marker = batsymbol, markersize = 50, color = :black)
7fea66e

Маркеры многоугольников

GeometryBasics.Polgyon также можно использовать в качестве маркера. Многоугольник всегда имеет один вектор точек, который образует контур. Он может принимать необязательный вектор векторов точек, каждый из которых образует отверстие в очерченной фигуре.

В этом примере маленький круг вырезается из большего круга:

using CairoMakie
using GeometryBasics
p_big = decompose(Point2f, Circle(Point2f(0), 1))
p_small = decompose(Point2f, Circle(Point2f(0), 0.5))
scatter(1:4, fill(0, 4), marker=Polygon(p_big, [p_small]), markersize=100, color=1:4, axis=(limits=(0, 5, -1, 1),))
c3895d6

Векторный размер маркеров

Масштабировать измерения x и y маркеров можно по отдельности, передавая Vec.

using CairoMakie
f = Figure()
ax = Axis(f[1, 1])

scales = range(0.5, 1.5, length = 10)

for (i, sx) in enumerate(scales)
    for (j, sy) in enumerate(scales)
        scatter!(ax, Point2f(i, j),
            marker = '✈',
            markersize = 30 .* Vec2f(sx, sy),
            color = :black)
    end
end

f
e63c088

Пространство маркеров

По умолчанию размеры маркеров задаются в пиксельных единицах. Чтобы изменить этот параметр, настройте markerspace. Например, для масштабирования маркера в единицах данных задайте markerspace = :data.

using CairoMakie
f = Figure()
ax = Axis(f[1, 1])
limits!(ax, -10, 10, -10, 10)

scatter!(ax, Point2f(0, 0), markersize = 20, markerspace = :data,
    marker = '✈', label = "markerspace = :data")
scatter!(ax, Point2f(0, 0), markersize = 20, markerspace = :pixel,
    marker = '✈', label = "markerspace = :pixel")

axislegend(ax)

f
7be7c49

Пример с расположениями аэропортов

using CairoMakie
using DelimitedFiles


a = readdlm(assetpath("airportlocations.csv"))

scatter(a[1:50:end, :], marker = '✈',
    markersize = 20, color = :black)
4be418c

Работа с артефактами контуров в GLMakie

В GLMakie трехмерные графики рассеяния могут генерировать артефакты контуров в зависимости от порядка отрисовки маркеров. В настоящее время существует несколько способов устранения этой проблемы, но все они связаны с определенными затратами.

  • fxaa = true отключит собственное сглаживание маркеров рассеяния и будет использовать вместо него fxaa. В результате получаются менее детализированные маркеры, особенно тонкие маркеры, такие как символы.

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

  • overdraw = true полностью отключит тестирование глубины (чтение и запись) для графика и удалит артефакты. Однако при этом изменится z-порядок маркеров линий, и отрисованные позже графики будут отображаться поверх графика рассеяния.

  • depthsorting = true отсортирует маркеры по глубине перед отрисовкой, чтобы устранить проблему. Это работает только в рамках вызова графика, поэтому если задействованы другие графики, проблема может возникнуть снова.

using GLMakie
ps = rand(Point3f, 500)
cs = rand(500)
f = Figure(size = (900, 650))
Label(f[1, 1], "base", tellwidth = false)
scatter(f[2, 1], ps, color = cs, markersize = 20, fxaa = false)
Label(f[1, 2], "fxaa = true", tellwidth = false)
scatter(f[2, 2], ps, color = cs, markersize = 20, fxaa = true)

Label(f[3, 1], "transparency = true", tellwidth = false)
scatter(f[4, 1], ps, color = cs, markersize = 20, transparency = true)
Label(f[3, 2], "overdraw = true", tellwidth = false)
scatter(f[4, 2], ps, color = cs, markersize = 20, overdraw = true)

Label(f[1, 3], "depthsorting = true", tellwidth = false)
scatter(f[2, 3], ps, color = cs, markersize = 20, depthsorting = true)
Label(f[3, 3], "depthsorting = true", tellwidth = false)
scatter(f[4, 3], ps, color = cs, markersize = 20, depthsorting = true)
mesh!(Rect3f(Point3f(0), Vec3f(0.9, 0.9, 0.9)), color = :orange)
f
83c7152

Атрибуты

alpha

Значение по умолчанию: 1.0

Альфа-значение цветовой карты или атрибута color. Несколько букв, таких как в plot(alpha=0.2, color=(:red, 0.5), будут умножены.

clip_planes

Значение по умолчанию: automatic

Плоскости обрезки позволяют выполнять обрезку в трехмерном пространстве. Вы можете задать вектор длиной до 8 Plane3f Здесь вы можете задать плоскости, за которыми участки будут обрезаны (т.е. станут невидимыми). По умолчанию плоскости обрезки наследуются от родительского участка или сцены. Вы можете удалить родительский элемент clip_planes передав Plane3f[].

color

Значение по умолчанию: @inherit markercolor

Задает цвет маркера. Если цвет не задан, несколько вызовов функции scatter! будут циклически переключаться между цветовой палитрой axis.

using CairoMakie
fig = Figure()
kwargs = (; markersize = 30, axis = (; limits = (0, 4, 0, 4)))
scatter(fig[1, 1], 1:3; kwargs..., color = :tomato)
scatter(fig[1, 2], 1:3; kwargs..., color = [RGBf(1, 0, 0), RGBf(0, 1, 0), RGBf(0, 0, 1)])
scatter(fig[2, 1], 1:3; kwargs..., color = [10, 20, 30])
scatter(fig[2, 2], 1:3; kwargs..., color = [10, 20, 30], colormap = :plasma)
fig
a633b1e

colormap

Значение по умолчанию: @inherit colormap :viridis

Устанавливает цветовую схему, которая выбирается для числовых значений. colors. PlotUtils.cgrad(...), Makie.Reverse(any_colormap) также можно использовать любой символ из ColorBrewer или PlotUtils. Чтобы просмотреть все доступные цветовые градиенты, вы можете позвонить по телефону Makie.available_gradients().

using CairoMakie
fig = Figure()
kwargs = (; markersize = 30, axis = (; limits = (0, 6, 0, 6)))
scatter(fig[1, 1], 1:5; kwargs..., color = 1:5, colormap = :viridis)
scatter(fig[1, 2], 1:5; kwargs..., color = 1:5, colormap = :plasma)
scatter(fig[2, 1], 1:5; kwargs..., color = 1:5, colormap = Reverse(:viridis))
scatter(fig[2, 2], 1:5; kwargs..., color = 1:5, colormap = [:tomato, :slategray2])
fig
a224f67

colorrange

Значение по умолчанию: automatic

Значения, представляющие начальную и конечную точки colormap.

colorscale

Значение по умолчанию: identity

Функция преобразования цвета. Может быть любой функцией, но хорошо работает только в сочетании с Colorbar для identity, log, log2, log10, sqrt, logit, Makie.pseudolog10 и Makie.Symlog10.

cycle

Значение по умолчанию: [:color]

Задает, какие атрибуты будут циклически использоваться при создании нескольких графиков

depth_shift

Значение по умолчанию: 0.0

настраивает значение глубины участка после всех других преобразований, т.е. в пространстве клипа, где 0 <= depth <= 1. This only applies to GLMakie and WGLMakie and can be used to adjust render order (like a tunable overdraw).

depthsorting

Значение по умолчанию: false

Enables depth-sorting of markers which can improve border artifacts. Currently supported in GLMakie only.

distancefield

Значение по умолчанию: nothing

Необязательное поле distancefield, используемое, например, для отображения шрифта и траектории Безье. Будет установлено автоматически.

font

Значение по умолчанию: @inherit markerfont

Устанавливает шрифт, используемый для маркеров символов. Может быть String указание (частичного) имени шрифта или пути к файлу шрифта

fxaa

Значение по умолчанию: false

настраивает, будет ли отображаться график с помощью fxaa (сглаживание, только для GLMakie).

glowcolor

Значение по умолчанию: (:black, 0.0)

Устанавливает цвет эффекта свечения вокруг маркера.

glowwidth

Значение по умолчанию: 0.0

Устанавливает размер эффекта свечения вокруг маркера.

highclip

Значение по умолчанию: automatic

Цвет для любого значения, превышающего цветовой диапазон.

inspectable

Значение по умолчанию: @inherit inspectable

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

inspector_clear

Значение по умолчанию: automatic

Устанавливает функцию обратного вызова (inspector, plot) -> ...</span> для очистки пользовательских индикаторов в DataInspector.

inspector_hover

Значение по умолчанию: automatic

Устанавливает функцию обратного вызова (inspector, plot, index) -> ... которая заменяет функцию по умолчанию show_data методы.

inspector_label

Значение по умолчанию: automatic

Устанавливает функцию обратного вызова (plot, index, position) -> string , которая заменяет метку по умолчанию, сгенерированную DataInspector.

lowclip

Значение по умолчанию: automatic

Цвет для любого значения ниже цветового диапазона.

marker

Значение по умолчанию: @inherit marker

Устанавливает маркер разброса.

marker_offset

Значение по умолчанию: Vec3f(0)

Смещение маркера от заданной позиции в markerspace единицы. Смещение, равное 0, соответствует маркеру по центру.

using CairoMakie
fig = Figure()
scatter(fig[1, 1], [Point2f(0) for _ in 1:5]; marker = Circle, markersize = 30,
    marker_offset = [(0, 0), (-50, 0), (0, -50), (50, 0), (0, 50)],
    color = [:black, :blue, :green, :red, :orange])
scatter(fig[1, 2], [Point3f(0) for _ in 1:7]; marker = :ltriangle, markersize = 0.2, markerspace = :data,
    marker_offset = Vec3f[(0, 0, 0), (-1, 0, 0), (0, -1, 0), (1, 0, 0), (0, 1, 0), (0, 0, -1), (0, 0, 1)],
    color = [:black, :blue, :green, :red, :orange, :cyan, :purple])
fig
bf8b10c

markersize

Значение по умолчанию: @inherit markersize

Устанавливает размер маркера, масштабируя его относительно базового размера, который может отличаться для каждого маркера. A Real масштабирует размеры x и y на одинаковую величину. A Vec или Tuple с двумя элементами, масштабируемыми по x и y отдельно. Массив из обоих элементов масштабирует каждый маркер отдельно. Люди воспринимают площадь маркера как его размер, который увеличивается квадратично с markersize, таким образом, умножая markersize увеличение на 2 приводит к тому, что маркер визуально увеличивается в 4 раза.

using CairoMakie
fig = Figure()
kwargs = (; marker = Rect, axis = (; limits = (0, 4, 0, 4)))
scatter(fig[1, 1], 1:3; kwargs..., markersize = 30)
scatter(fig[1, 2], 1:3; kwargs..., markersize = (30, 20))
scatter(fig[2, 1], 1:3; kwargs..., markersize = [10, 20, 30])
scatter(fig[2, 2], 1:3; kwargs..., markersize = [(10, 20), (20, 30), (40, 30)])
fig
96e90d6

markerspace

Значение по умолчанию: :pixel

Задает пробел, в котором задано значение markersize . Видеть Makie.spaces() для получения возможных исходных данных

model

Значение по умолчанию: automatic

Задает матрицу модели для построения графика. Это отменяет корректировки, сделанные с помощью translate!, rotate! и scale!.

nan_color

Значение по умолчанию: :transparent

Цвет для значений NaN.

overdraw

Значение по умолчанию: false

Определяет, будет ли график отображаться поверх других графиков. В частности, это означает игнорирование проверок глубины в GL-интерфейсах

rotation

Значение по умолчанию: Billboard()

Задает вращение маркера. A Billboard вращение всегда происходит вокруг оси глубины.

using CairoMakie
fig = Figure()
kwargs = (; marker = :utriangle, markersize = 30, axis = (; limits = (0, 4, 0, 4)))
scatter(fig[1, 1], 1:3; kwargs...)
scatter(fig[1, 2], 1:3; kwargs..., rotation = deg2rad(45))
scatter(fig[1, 3], 1:3; kwargs..., rotation = deg2rad.([0, 45, 90]))
fig
68672e0

space

Значение по умолчанию: :data

задает область преобразования для прямоугольника, охватывающего участок. Видеть Makie.spaces() для получения возможных исходных данных.

ssao

Значение по умолчанию: false

Настраивает, будет ли отображаться график с помощью ssao (сглаживания окружающего пространства экрана). Обратите внимание, что это имеет смысл только для 3D-графиков и применимо только к fxaa = true.

strokecolor

Значение по умолчанию: @inherit markerstrokecolor

Задает цвет контура вокруг маркера.

using CairoMakie
fig = Figure()
kwargs = (; markersize = 30, strokewidth = 3)
scatter(fig[1, 1], 1:3; kwargs..., strokecolor = :tomato)
scatter(fig[1, 2], 1:3; kwargs..., strokecolor = [RGBf(1, 0, 0), RGBf(0, 1, 0), RGBf(0, 0, 1)])
fig
19a21a1

strokewidth

Значение по умолчанию: @inherit markerstrokewidth

Задает ширину контура вокруг маркера.

using CairoMakie
fig = Figure()
kwargs = (; markersize = 30, strokecolor = :tomato)
scatter(fig[1, 1], 1:3; kwargs..., strokewidth = 3)
scatter(fig[1, 2], 1:3; kwargs..., strokewidth = [0, 3, 6])
fig
c0a86dc

transform_marker

Значение по умолчанию: false

Определяет, применяется ли модельная матрица (без перевода) к самому маркеру, а не только к позициям. (Если это верно, scale! и rotate! это повлияет на маркер.

transformation

Значение по умолчанию: :automatic

Документация недоступна.

transparency

Значение по умолчанию: false

Настраивает прозрачность графика. В GLMakie transparency = true в результате используется прозрачность, независимая от порядка.

uv_offset_width

Значение по умолчанию: (0.0, 0.0, 0.0, 0.0)

Документация недоступна.

visible

Значение по умолчанию: true

Определяет, будет ли отображаться график или нет.