scatter
|
Страница в процессе перевода. |
#
MakieCore.scatter — Function
scatter(positions)
scatter(x, y)
scatter(x, y, z)
Строит маркер для каждого элемента в (x, y, z), (x, y) или positions.
Тип графика
Псевдоним типа графика для функции scatter — Scatter.
Примеры
Использование векторов x и y
using CairoMakie
xs = range(0, 10, length = 30)
ys = 0.5 .* sin.(xs)
scatter(xs, ys)
Использование точек
Также можно передать координаты в виде вектора точек, что предпочтительнее, если координаты должны быть обновлены позже, чтобы избежать разной длины 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)
Маркеры
Существует несколько различных категорий маркеров, которые можно использовать с 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
Атрибут 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
Маркеры по умолчанию 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
Если требуется маркер, имеющий точный базовый размер, позволяющий сопоставлять его с линиями или другими объектами графика известного размера, или вы хотите использовать маркер в пространстве данных, можно сконструировать такой маркер самостоятельно, используя 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)))
Маркеры пути Безье
Пути Безье лежат в основе векторных графических форматов, таких как 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],
)
Отверстия
Пути могут иметь отверстия — просто начните новый подпуть с 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,
)
Построение из строк SVG-путей
Путь Безье можно создать из из строки спецификации SVG-пути. С помощью ключевых слов fit, flipy и flipx можно автоматически изменять размер пути и менять направление осей y и x (в SVG обычно используется система координат, в которой y увеличивается вниз). По умолчанию ограничивающий прямоугольник для подогнанного пути представляет собой квадрат шириной 1 с центром в нуле. С помощью именованного аргумента bbox можно передать другой ограничивающий Rect. По умолчанию аспект пути остается нетронутым, а если он не совпадает с новым ограничивающим прямоугольником, путь центрируется так, чтобы он располагался внутри. Установите keep_aspect = false, чтобы поместить путь в ограничивающий прямоугольник, не учитывая его исходное соотношение сторон.
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)
Маркеры многоугольников
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),))
Векторный размер маркеров
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
Пространство маркеров
По умолчанию размеры маркеров задаются в пиксельных единицах. Чтобы изменить этот параметр, настройте 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
Пример с расположениями аэропортов
using CairoMakie
using DelimitedFiles
a = readdlm(assetpath("airportlocations.csv"))
scatter(a[1:50:end, :], marker = '✈',
markersize = 20, color = :black)
Работа с артефактами контуров в 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
Атрибуты
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).
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.
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!.
overdraw
Значение по умолчанию: false
определяет то, будет ли график отрисовываться поверх других графиков. В частности, это означает игнорирование проверок глубины в бэкендах GL.
rotation
Значение по умолчанию: Billboard()
задает поворот маркера. Поворот Billboard всегда происходит вокруг оси глубины.
space
Значение по умолчанию: :data
задает пространство преобразования для прямоугольника, охватывающего график. Возможные входные данные см. в описании Makie.spaces().
ssao
Значение по умолчанию: false
определяет то, будет ли график отрисовываться с использованием ssao (преграждение окружающего света в экранном пространстве). Обратите внимание, что это имеет смысл только для трехмерных графиков и применимо только с fxaa = true.
strokewidth
Значение по умолчанию: @inherit markerstrokewidth
задает толщину контура вокруг маркера.
transform_marker
Значение по умолчанию: false
определяет то, применяется ли модельная матрица (без преобразования) к самому маркеру, а не только к позициям. (При значении true функции scale! и rotate! влияют на маркер.)