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
Альфа-значение цветовой карты или атрибута 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
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
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).
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.
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
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
markerspace
Значение по умолчанию: :pixel
Задает пробел, в котором задано значение markersize . Видеть Makie.spaces() для получения возможных исходных данных
model
Значение по умолчанию: automatic
Задает матрицу модели для построения графика. Это отменяет корректировки, сделанные с помощью translate!, rotate! и scale!.
overdraw
Значение по умолчанию: false
Определяет, будет ли график отображаться поверх других графиков. В частности, это означает игнорирование проверок глубины в GL-интерфейсах
rotation
Значение по умолчанию: 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
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
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
transform_marker
Значение по умолчанию: false
Определяет, применяется ли модельная матрица (без перевода) к самому маркеру, а не только к позициям. (Если это верно, scale! и rotate! это повлияет на маркер.