heatmap
|
Страница в процессе перевода. |
#
MakieCore.heatmap — Function
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.
Примеры
Два вектора и матрица
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
Тот же подход работает и для неравномерно расположенных ячеек. Обратите внимание, что прямоугольники не центрированы вокруг точек, поскольку их границы расположены между соседними точками, как ячейки Вороного.
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
Если добавить еще один элемент к 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
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
Использование 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))
Три вектора
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)
Панель цветов для одной тепловой карты
Чтобы получить шкалу отображения цветов, добавьте панель цветов. Панель цветов размещается внутри рисунка в первом аргументе, а масштаб и цветовую карту можно задать путем передачи соответствующей тепловой карты.
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
Панель цветов для нескольких тепловых карт
Когда на одном рисунке присутствует несколько тепловых карт, может быть полезно, чтобы все они были представлены одной панелью цветов. Затем важно синхронизировать масштабы и цветовые карты для тепловых карт и панели цветов. Для этого нужно явным образом задать диапазон цветов, чтобы он не зависел от данных, отображаемых на данной тепловой карте.
Поскольку тепловые карты в приведенном ниже примере имеют одинаковые диапазон цветов и цветовую карту, любой из этих компонентов можно передать в 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
Использование пользовательской цветовой шкалы
С помощью типа 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
Построение крупных тепловых карт
Имеющиеся данные можно заключить в 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)
В 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).
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.
model
Значение по умолчанию: automatic
задает модельную матрицу для графика. Переопределяет настройки, выполненные с помощью translate!, rotate! и scale!.
overdraw
Значение по умолчанию: false
определяет то, будет ли график отрисовываться поверх других графиков. В частности, это означает игнорирование проверок глубины в бэкендах GL.
space
Значение по умолчанию: :data
задает пространство преобразования для прямоугольника, охватывающего график. Возможные входные данные см. в описании Makie.spaces().
ssao
Значение по умолчанию: false
определяет то, будет ли график отрисовываться с использованием ssao (преграждение окружающего света в экранном пространстве). Обратите внимание, что это имеет смысл только для трехмерных графиков и применимо только с fxaa = true.