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

heatmap

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

heatmap(x, y, matrix)
heatmap(x, y, func)
heatmap(matrix)
heatmap(xvector, yvector, zvector)

Строит тепловую карту в виде коллекции прямоугольников. x и y могут иметь длину i и j, где (i, j) равно size(matrix). В этом случае прямоугольники будут размещаться вокруг этих точек сетки как ячейки Вороного. Обратите внимание, что для x и y с неравномерными интервалами задаваемые ими точки не центрируются внутри полученных прямоугольников.

x и y также могут иметь длину i+1 и j+1; в этом случае они интерпретируются как стороны прямоугольников.

Цвета прямоугольников берутся из matrix[i, j]. Третий аргумент также может быть функцией (Function) (i, j) -> v, которая затем вычисляется по сетке, охватываемой x и y.

Еще один допустимый вариант — использование трех векторов xvector, yvector и zvector. В этом случае предполагается, что ни одна пара элементов x и y не повторяется. Пары, отсутствующие в итоговой сетке, будут рассматриваться так, как если бы zvector имел элемент NaN в этой позиции.

Если x и y опущены в аргументе матрицы, по умолчанию они равны x, y = axes(matrix).

Обратите внимание, что heatmap отрисовывается медленнее, чем image, поэтому для больших равномерно распределенных сеток следует предпочесть image.

Тип графика

Псевдоним типа графика для функции heatmap — Heatmap.

Примеры

Два вектора и матрица

В этом примере x и y задают точки, вокруг которых размещаются ячейки тепловой карты.

using CairoMakie
f = Figure()
ax = Axis(f[1, 1])

centers_x = 1:5
centers_y = 6:10
data = reshape(1:25, 5, 5)

heatmap!(ax, centers_x, centers_y, data)

scatter!(ax, [(x, y) for x in centers_x for y in centers_y], color=:white, strokecolor=:black, strokewidth=1)

f
958b81c

Тот же подход работает и для неравномерно расположенных ячеек. Обратите внимание, что прямоугольники не центрированы вокруг точек, поскольку их границы расположены между соседними точками, как ячейки Вороного.

using CairoMakie
f = Figure()
ax = Axis(f[1, 1])

centers_x = [1, 2, 4, 7, 11]
centers_y = [6, 7, 9, 12, 16]
data = reshape(1:25, 5, 5)

heatmap!(ax, centers_x, centers_y, data)

scatter!(ax, [(x, y) for x in centers_x for y in centers_y], color=:white, strokecolor=:black, strokewidth=1)
f
80fdd26

Если добавить еще один элемент к x и y, теперь они будут задавать края прямоугольных ячеек. Вот регулярная сетка:

using CairoMakie
f = Figure()
ax = Axis(f[1, 1])

edges_x = 1:6
edges_y = 7:12
data = reshape(1:25, 5, 5)

heatmap!(ax, edges_x, edges_y, data)

scatter!(ax, [(x, y) for x in edges_x for y in edges_y], color=:white, strokecolor=:black, strokewidth=1)
f
7857824

Можно проделать то же самое с нерегулярной сеткой:

using CairoMakie
f = Figure()
ax = Axis(f[1, 1])

borders_x = [1, 2, 4, 7, 11, 16]
borders_y = [6, 7, 9, 12, 16, 21]
data = reshape(1:25, 5, 5)

heatmap!(ax, borders_x, borders_y, data)
scatter!(ax, [(x, y) for x in borders_x for y in borders_y], color=:white, strokecolor=:black, strokewidth=1)
f
531d4c2

Использование Function вместо Matrix

Если в качестве аргумента values используется Function в форме (i, j) -> v, вычисление выполняется по сетке, охватываемой x и y.

using CairoMakie
function mandelbrot(x, y)
    z = c = x + y*im
    for i in 1:30.0; abs(z) > 2 && return i; z = z^2 + c; end; 0
end

heatmap(-2:0.001:1, -1.1:0.001:1.1, mandelbrot,
    colormap = Reverse(:deep))
cbe970f

Три вектора

Повторяющиеся сочетания x и y запрещены, но допускается отсутствие значений.

using CairoMakie
xs = [1, 2, 3, 1, 2, 3, 1, 2, 3]
ys = [1, 1, 1, 2, 2, 2, 3, 3, 3]
zs = [1, 2, 3, 4, 5, 6, 7, 8, NaN]

heatmap(xs, ys, zs)
4ccd776

Панель цветов для одной тепловой карты

Чтобы получить шкалу отображения цветов, добавьте панель цветов. Панель цветов размещается внутри рисунка в первом аргументе, а масштаб и цветовую карту можно задать путем передачи соответствующей тепловой карты.

using CairoMakie
xs = range(0, 2π, length=100)
ys = range(0, 2π, length=100)
zs = [sin(x*y) for x in xs, y in ys]

fig, ax, hm = heatmap(xs, ys, zs)
Colorbar(fig[:, end+1], hm)

fig
f52fc95

Панель цветов для нескольких тепловых карт

Когда на одном рисунке присутствует несколько тепловых карт, может быть полезно, чтобы все они были представлены одной панелью цветов. Затем важно синхронизировать масштабы и цветовые карты для тепловых карт и панели цветов. Для этого нужно явным образом задать диапазон цветов, чтобы он не зависел от данных, отображаемых на данной тепловой карте.

Поскольку тепловые карты в приведенном ниже примере имеют одинаковые диапазон цветов и цветовую карту, любой из этих компонентов можно передать в Colorbar, чтобы панель цветов получила те же атрибуты. Кроме того, атрибуты панели цветов можно задать явным образом.

using CairoMakie
xs = range(0, 2π, length=100)
ys = range(0, 2π, length=100)
zs1 = [sin(x*y) for x in xs, y in ys]
zs2 = [2sin(x*y) for x in xs, y in ys]

joint_limits = (-2, 2)  # здесь для простоты мы выбираем ограничения вручную, а не вычисляем их

fig, ax1, hm1 = heatmap(xs, ys, zs1,  colorrange = joint_limits)
ax2, hm2 = heatmap(fig[1, end+1], xs, ys, zs2, colorrange = joint_limits)

Colorbar(fig[:, end+1], hm1)                     # Эти три
Colorbar(fig[:, end+1], hm2)                     # панели цветов
Colorbar(fig[:, end+1], colorrange = joint_limits)  # эквивалентны

fig
288512f

Использование пользовательской цветовой шкалы

С помощью типа ReversibleScale можно определить пользовательскую (цветовую) шкалу. Если преобразование достаточно простое (log, sqrt, …​), автоматически выводится обратное преобразование.

using CairoMakie
x = 10.0.^(1:0.1:4)
y = 1.0:0.1:5.0
z = broadcast((x, y) -> x - 10, x, y')

scale = ReversibleScale(x -> asinh(x / 2) / log(10), x -> 2sinh(log(10) * x))
fig, ax, hm = heatmap(x, y, z; colorscale = scale, axis = (; xscale = scale))
Colorbar(fig[1, 2], hm)

fig
16ed7db

Построение крупных тепловых карт

Имеющиеся данные можно заключить в Makie.Resampler, чтобы автоматически повторно выполнять выборки крупных тепловых карт только для области просмотра. При увеличении масштаба повторно выбранная версия будет обновляться для отображения с максимальной точностью. Обновления блокируются при нажатии любой кнопки мыши или клавиатуры, чтобы не перегружать, например WGLMakie, обновлениями данных. Это хорошо работает с Axis(figure; zoombutton=Keyboard.left_control). Это поведение можно отключить с помощью

Resampler(data; update_while_button_pressed=true).

Пример:

using Downloads, FileIO, GLMakie
# изображение 30000×22943
path = Downloads.download("https://upload.wikimedia.org/wikipedia/commons/7/7e/In_the_Conservatory.jpg")
img = rotr90(load(path))
f, ax, pl = heatmap(Resampler(img); axis=(; aspect=DataAspect()), figure=(;size=size(img)./20))
hidedecorations!(ax)
f

Для повышения качества при сниженной частоте выборки рекомендуется использовать Makie.Pyramid (может быть перенесен в другой пакет), который создает простую гауссову пирамиду для эффективной выборки со сниженной частотой и без артефактов:

pyramid = Makie.Pyramid(img)
fsize = (size(img) ./ 30) .* (1, 2)
fig, ax, pl = heatmap(Resampler(pyramid);
    axis=(; aspect=DataAspect(), title="Pyramid"), figure=(; size=fsize))
hidedecorations!(ax)
ax, pl = heatmap(fig[2, 1], Resampler(img1);
    axis=(; aspect=DataAspect(), title="No Pyramid"))
hidedecorations!(ax)
save("heatmap-pyramid.png", fig)
heatmap pyramid

В Resampler допускается любой другой тип массива, и он также может реализовывать свою собственную стратегию интерполяции путем перегрузки:

function (array::ArrayType)(xrange::LinRange, yrange::LinRange)
    ...
end

Атрибуты

alpha

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

clip_planes

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

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.

depth_shift

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

fxaa

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

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.

interpolate

Значение по умолчанию: false
определяет, следует ли интерполировать цвета.

lowclip

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

model

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

nan_color

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

overdraw

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

space

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

ssao

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

transformation

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

transparency

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

visible

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