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

tricontourf

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

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
f72e7d9

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
8430630

Режимы триангуляции

Ручные триангуляции могут быть переданы в виде матрицы целых чисел 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
e85614c

По умолчанию 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
1d9dfbe

Граничные узлы позволяют поддерживать более сложные области, возможно, с отверстиями, чем это допустимо при указании только самих точек.

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
e75ec3e

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
941583c

Относительный режим

Иногда бывает полезно отбросить одну часть диапазона значений, обычно в сторону внешней границы. Вместо того чтобы указывать включаемые уровни вручную, можно задать атрибуту 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
c810478

Атрибуты

clip_planes

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

colormap

Значение по умолчанию: @inherit colormap
задает цветовую карту, из которой производится выборка цветов полос.

colorscale

Значение по умолчанию: identity
функция преобразования цвета.

depth_shift

Значение по умолчанию: 0.0
корректирует значение глубины графика после всех остальных преобразований, т. е. в пространстве отсечения, где 0 <= depth <= 1. Применимо только к GLMakie и WGLMakie и может использоваться для настройки порядка отрисовки (настраиваемая перерисовка).

edges

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

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!.

nan_color

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

overdraw

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

space

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

ssao

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

transformation

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

transparency

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

triangulation

Значение по умолчанию: DelaunayTriangulation()
режим триангуляции точек в xs и ys. При передаче DelaunayTriangulation() выполняется триангуляция Делоне. Можно также передать существующую триангуляцию в виде матрицы AbstractMatrix{<:Int} размером (3, n), каждый столбец которой определяет индексы вершин одного треугольника, или в виде объекта Triangulation из DelaunayTriangulation.jl.

visible

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