Документация 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)
4631e2e

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

Также можно передать координаты в виде вектора точек, что предпочтительнее, если координаты должны быть обновлены позже, чтобы избежать разной длины 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)
6a969f6

Маркеры

Существует несколько различных категорий маркеров, которые можно использовать с 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
8ee7982

Атрибут 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
98358d6

Маркеры по умолчанию 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
5bf738b

Если требуется маркер, имеющий точный базовый размер, позволяющий сопоставлять его с линиями или другими объектами графика известного размера, или вы хотите использовать маркер в пространстве данных, можно сконструировать такой маркер самостоятельно, используя 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)))
7275484

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

Пути Безье лежат в основе векторных графических форматов, таких как 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],
)
d208fa4

Отверстия

Пути могут иметь отверстия — просто начните новый подпуть с 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,
)
f71606e

Построение из строк 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)
8aa5bcf

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

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),))
d0e5a08

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

Масштабировать измерения 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
f0f7fd4

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

По умолчанию размеры маркеров задаются в пиксельных единицах. Чтобы изменить этот параметр, настройте 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
8944be0

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

using CairoMakie
using DelimitedFiles


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

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

Работа с артефактами контуров в 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
91221c9

Атрибуты

alpha

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

clip_planes

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

color

Значение по умолчанию: @inherit markercolor
задает цвет маркера. Если цвет не задан, многократные вызовы scatter! будут циклически перебирать цветовую палитру оси.

colormap

Значение по умолчанию: @inherit colormap :viridis
задает цветовую карту, из которой производится выборка для числовых значений color. Также можно использовать PlotUtils.cgrad(...), Makie.Reverse(any_colormap) или любой символ из ColorBrewer или PlotUtils. Чтобы увидеть все доступные цветовые градиенты, можно вызвать Makie.available_gradients().

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. Применимо только к GLMakie и WGLMakie и может использоваться для настройки порядка отрисовки (настраиваемая перерисовка).

depthsorting

Значение по умолчанию: false
позволяет сортировать маркеры по глубине, что может улучшить граничные артефакты. В настоящее время поддерживается только в GLMakie.

distancefield

Значение по умолчанию: nothing
необязательное поле расстояния, используемое, например, для отрисовки шрифта и пути Безье. Задается автоматически.

fxaa

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

glowcolor

Значение по умолчанию: (:black, 0.0)
задает цвет эффекта свечения вокруг маркера.

glowwidth

Значение по умолчанию: 0.0
задает размер эффекта свечения вокруг маркера.

highclip

Значение по умолчанию: automatic
цвет для любого значения выше цветового диапазона.

inspectable

Значение по умолчанию: true
определяет, должен ли график проверяться с помощью DataInspector.

inspector_clear

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

inspector_hover

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

inspector_label

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

lowclip

Значение по умолчанию: automatic
цвет для любого значения ниже цветового диапазона.

marker

Значение по умолчанию: @inherit marker
задает маркер рассеяния.

marker_offset

Значение по умолчанию: automatic
смещение маркера от заданной позиции в единицах markerspace. По умолчанию маркер центрируется вокруг позиции (markersize * --0,5).

markersize

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

markerspace

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

model

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

nan_color

Значение по умолчанию: :transparent
цвет для значений NaN.

overdraw

Значение по умолчанию: false
определяет то, будет ли график отрисовываться поверх других графиков. В частности, это означает игнорирование проверок глубины в бэкендах GL.

rotation

Значение по умолчанию: Billboard()
задает поворот маркера. Поворот Billboard всегда происходит вокруг оси глубины.

space

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

ssao

Значение по умолчанию: false
определяет то, будет ли график отрисовываться с использованием ssao (преграждение окружающего света в экранном пространстве). Обратите внимание, что это имеет смысл только для трехмерных графиков и применимо только с fxaa = true.

strokecolor

Значение по умолчанию: @inherit markerstrokecolor
задает цвет контура вокруг маркера.

strokewidth

Значение по умолчанию: @inherit markerstrokewidth
задает толщину контура вокруг маркера.

transform_marker

Значение по умолчанию: false
определяет то, применяется ли модельная матрица (без преобразования) к самому маркеру, а не только к позициям. (При значении true функции scale! и rotate! влияют на маркер.)

transformation

Значение по умолчанию: automatic
документация недоступна.

transparency

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

uv_offset_width

Значение по умолчанию: (0.0, 0.0, 0.0, 0.0)
документация недоступна.

visible

Значение по умолчанию: true
определяет то, будет ли отрисовываться график.