tricontourf
|
Страница в процессе перевода. |
#
Makie.tricontourf — Function
tricontourf(triangles::Triangulation, zs; kwargs...)
tricontourf(xs, ys, zs; kwargs...)
Строит контур триангуляции с заливкой в соответствии с информацией о высоте в zs в позициях по горизонтали xs и позициях по вертикали ys. Вместо xs и ys для указания треугольников можно также предоставить объект Triangulation из DelaunayTriangulation.jl; в противном случае вычисляется неограниченная триангуляция xs и ys.
Тип графика
Псевдоним типа графика для функции tricontourf — Tricontourf.
Примеры
using CairoMakie
using Random
Random.seed!(1234)
x = randn(50)
y = randn(50)
z = -sqrt.(x .^ 2 .+ y .^ 2) .+ 0.1 .* randn.()
f, ax, tr = tricontourf(x, y, z)
scatter!(x, y, color = z, strokewidth = 1, strokecolor = :black)
Colorbar(f[1, 2], tr)
f
using CairoMakie
using Random
Random.seed!(1234)
x = randn(200)
y = randn(200)
z = x .* y
f, ax, tr = tricontourf(x, y, z, colormap = :batlow)
scatter!(x, y, color = z, colormap = :batlow, strokewidth = 1, strokecolor = :black)
Colorbar(f[1, 2], tr)
f
Режимы триангуляции
Ручные триангуляции могут быть переданы в виде матрицы целых чисел 3xN, где каждый столбец из трех целых чисел задает индексы углов одного треугольника в векторе точек.
using CairoMakie
using Random
Random.seed!(123)
n = 20
angles = range(0, 2pi, length = n+1)[1:end-1]
x = [cos.(angles); 2 .* cos.(angles .+ pi/n)]
y = [sin.(angles); 2 .* sin.(angles .+ pi/n)]
z = (x .- 0.5).^2 + (y .- 0.5).^2 .+ 0.5.*randn.()
triangulation_inner = reduce(hcat, map(i -> [0, 1, n] .+ i, 1:n))
triangulation_outer = reduce(hcat, map(i -> [n-1, n, 0] .+ i, 1:n))
triangulation = hcat(triangulation_inner, triangulation_outer)
f, ax, _ = tricontourf(x, y, z, triangulation = triangulation,
axis = (; aspect = 1, title = "Manual triangulation"))
scatter!(x, y, color = z, strokewidth = 1, strokecolor = :black)
tricontourf(f[1, 2], x, y, z, triangulation = Makie.DelaunayTriangulation(),
axis = (; aspect = 1, title = "Delaunay triangulation"))
scatter!(x, y, color = z, strokewidth = 1, strokecolor = :black)
f
По умолчанию tricontourf выполняет триангуляцию без ограничений. Для более точного управления триангуляцией (например, принудительного задания границ) используйте пакет DelaunayTriangulation.jl с последующей передачей полученной триангуляции в качестве первого аргумента tricontourf. Например, приведенное выше кольцо можно построить следующим образом:
using CairoMakie
using DelaunayTriangulation
using Random
Random.seed!(123)
n = 20
angles = range(0, 2pi, length = n+1)[1:end-1]
x = [cos.(angles); 2 .* cos.(angles .+ pi/n)]
y = [sin.(angles); 2 .* sin.(angles .+ pi/n)]
z = (x .- 0.5).^2 + (y .- 0.5).^2 .+ 0.5.*randn.()
inner = [n:-1:1; n] # внутренняя часть по часовой стрелке
outer = [(n+1):(2n); n+1] # внешняя часть против часовой стрелки
boundary_nodes = [[outer], [inner]]
points = [x'; y']
tri = triangulate(points; boundary_nodes = boundary_nodes)
f, ax, _ = tricontourf(tri, z;
axis = (; aspect = 1, title = "Constrained triangulation\nvia DelaunayTriangulation.jl"))
scatter!(x, y, color = z, strokewidth = 1, strokecolor = :black)
f
Граничные узлы позволяют поддерживать более сложные области, возможно, с отверстиями, чем это допустимо при указании только самих точек.
using CairoMakie
using DelaunayTriangulation
## Начните с определения границ, а затем преобразуйте в соответствующий интерфейс
curve_1 = [
[(0.0, 0.0), (5.0, 0.0), (10.0, 0.0), (15.0, 0.0), (20.0, 0.0), (25.0, 0.0)],
[(25.0, 0.0), (25.0, 5.0), (25.0, 10.0), (25.0, 15.0), (25.0, 20.0), (25.0, 25.0)],
[(25.0, 25.0), (20.0, 25.0), (15.0, 25.0), (10.0, 25.0), (5.0, 25.0), (0.0, 25.0)],
[(0.0, 25.0), (0.0, 20.0), (0.0, 15.0), (0.0, 10.0), (0.0, 5.0), (0.0, 0.0)]
] # крайняя внешняя граница: против часовой стрелки
curve_2 = [
[(4.0, 6.0), (4.0, 14.0), (4.0, 20.0), (18.0, 20.0), (20.0, 20.0)],
[(20.0, 20.0), (20.0, 16.0), (20.0, 12.0), (20.0, 8.0), (20.0, 4.0)],
[(20.0, 4.0), (16.0, 4.0), (12.0, 4.0), (8.0, 4.0), (4.0, 4.0), (4.0, 6.0)]
] # внутренняя граница: по часовой стрелке
curve_3 = [
[(12.906, 10.912), (16.0, 12.0), (16.16, 14.46), (16.29, 17.06),
(13.13, 16.86), (8.92, 16.4), (8.8, 10.9), (12.906, 10.912)]
] # находится внутри curve_2, значит, идет против часовой стрелки
curves = [curve_1, curve_2, curve_3]
points = [
(3.0, 23.0), (9.0, 24.0), (9.2, 22.0), (14.8, 22.8), (16.0, 22.0),
(23.0, 23.0), (22.6, 19.0), (23.8, 17.8), (22.0, 14.0), (22.0, 11.0),
(24.0, 6.0), (23.0, 2.0), (19.0, 1.0), (16.0, 3.0), (10.0, 1.0), (11.0, 3.0),
(6.0, 2.0), (6.2, 3.0), (2.0, 3.0), (2.6, 6.2), (2.0, 8.0), (2.0, 11.0),
(5.0, 12.0), (2.0, 17.0), (3.0, 19.0), (6.0, 18.0), (6.5, 14.5),
(13.0, 19.0), (13.0, 12.0), (16.0, 8.0), (9.8, 8.0), (7.5, 6.0),
(12.0, 13.0), (19.0, 15.0)
]
boundary_nodes, points = convert_boundary_points_to_indices(curves; existing_points=points)
edges = Set(((1, 19), (19, 12), (46, 4), (45, 12)))
## Извлеките x, y
tri = triangulate(points; boundary_nodes = boundary_nodes, segments = edges)
z = [(x - 1) * (y + 1) for (x, y) in DelaunayTriangulation.each_point(tri)] # обратите внимание, что each_point сохраняет порядок индексов
f, ax, _ = tricontourf(tri, z, levels = 30; axis = (; aspect = 1))
f
using CairoMakie
using DelaunayTriangulation
using Random
Random.seed!(1234)
θ = [LinRange(0, 2π * (1 - 1/19), 20); 0]
xy = Vector{Vector{Vector{NTuple{2,Float64}}}}()
cx = [0.0, 3.0]
for i in 1:2
push!(xy, [[(cx[i] + cos(θ), sin(θ)) for θ in θ]])
push!(xy, [[(cx[i] + 0.5cos(θ), 0.5sin(θ)) for θ in reverse(θ)]])
end
boundary_nodes, points = convert_boundary_points_to_indices(xy)
tri = triangulate(points; boundary_nodes=boundary_nodes)
z = [(x - 3/2)^2 + y^2 for (x, y) in DelaunayTriangulation.each_point(tri)] # обратите внимание, что each_point сохраняет порядок индексов
f, ax, tr = tricontourf(tri, z, colormap = :matter)
f
Относительный режим
Иногда бывает полезно отбросить одну часть диапазона значений, обычно в сторону внешней границы. Вместо того чтобы указывать включаемые уровни вручную, можно задать атрибуту mode значение :relative и указать уровни от 0 до 1 относительно текущего минимального и максимального значений.
using CairoMakie
using Random
Random.seed!(1234)
x = randn(50)
y = randn(50)
z = -sqrt.(x .^ 2 .+ y .^ 2) .+ 0.1 .* randn.()
f, ax, tr = tricontourf(x, y, z, mode = :relative, levels = 0.2:0.1:1)
scatter!(x, y, color = z, strokewidth = 1, strokecolor = :black)
Colorbar(f[1, 2], tr)
f
Атрибуты
clip_planes
Значение по умолчанию: automatic
плоскости отсечения позволяют выполнять отсечение в трехмерном пространстве. Здесь можно указать вектор из 8 плоскостей Plane3f, за которыми графики будут отсечены (т. е. станут невидимыми). По умолчанию плоскости отсечения наследуются от родительского графика или сцены. Чтобы удалить родительский объект clip_planes, передайте Plane3f[].
colormap
Значение по умолчанию: @inherit colormap
задает цветовую карту, из которой производится выборка цветов полос.
depth_shift
Значение по умолчанию: 0.0
корректирует значение глубины графика после всех остальных преобразований, т. е. в пространстве отсечения, где 0 <= depth <= 1. Применимо только к GLMakie и WGLMakie и может использоваться для настройки порядка отрисовки (настраиваемая перерисовка).
extendhigh
Значение по умолчанию: nothing
задает цвет необязательной дополнительной полосы от максимального значения levels до maximum(zs). При значении :auto выбирается верхний конец цветовой карты, а остальные цвета сдвигаются соответствующим образом. Если это какое-либо представление цвета, используется данный цвет. При значении nothing полоса не добавляется.
extendlow
Значение по умолчанию: nothing
задает цвет необязательной дополнительной полосы от minimum(zs) до минимального значения levels. При значении :auto выбирается нижний конец цветовой карты, а остальные цвета сдвигаются соответствующим образом. Если это какое-либо представление цвета, используется данный цвет. При значении nothing полоса не добавляется.
fxaa
Значение по умолчанию: true
определяет то, будет ли график отрисовываться с помощью 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.
levels
Значение по умолчанию: 10
значением может быть либо число Int, в результате чего получается n полос, разделенных n+1 равноотстоящими уровнями, либо вектор AbstractVector{<:Real} со списком n последовательных краев от нижнего до верхнего, в результате чего получается n-1 полос.
mode
Значение по умолчанию: :normal
задает способ интерпретации вектора уровней: при значении :relative каждое число интерпретируется как доля между минимальным и максимальным значениями zs. Например, при levels = 0.1:0.1:1.0 исключаются нижние 10 % данных.
model
Значение по умолчанию: automatic
задает модельную матрицу для графика. Переопределяет настройки, выполненные с помощью translate!, rotate! и scale!.
overdraw
Значение по умолчанию: false
определяет то, будет ли график отрисовываться поверх других графиков. В частности, это означает игнорирование проверок глубины в бэкендах GL.
space
Значение по умолчанию: :data
задает пространство преобразования для прямоугольника, охватывающего график. Возможные входные данные см. в описании Makie.spaces().
ssao
Значение по умолчанию: false
определяет то, будет ли график отрисовываться с использованием ssao (преграждение окружающего света в экранном пространстве). Обратите внимание, что это имеет смысл только для трехмерных графиков и применимо только с fxaa = true.
transparency
Значение по умолчанию: false
определяет то, как реализуется прозрачность графика. В GLMakie transparency = true приводит к использованию прозрачности, независимой от порядка.
triangulation
Значение по умолчанию: DelaunayTriangulation()
режим триангуляции точек в xs и ys. При передаче DelaunayTriangulation() выполняется триангуляция Делоне. Можно также передать существующую триангуляцию в виде матрицы AbstractMatrix{<:Int} размером (3, n), каждый столбец которой определяет индексы вершин одного треугольника, или в виде объекта Triangulation из DelaunayTriangulation.jl.