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

Часто задаваемые вопросы

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

Проблемы с установкой

Предполагается, что Julia запускается в образе системы по умолчанию без PackageCompiler.

Объект Scene не отображается, или не удается выполнить сборку GLMakie

Если сборка Makie выполняется, но при построении графика не отображается ни он, ни окно, возможно, сборка бэкенда была произведена неправильно. По умолчанию Makie пытается использовать GLMakie в качестве бэкенда, но, если по какой-либо причине его сборка выполняется неправильно, сцены не отображаются. Убедитесь в том, что ваша видеокарта поддерживает OpenGL. Если нет (старые модели или относительно старые интегрированные видеокарты), стоит обратить внимание на CairoMakie.

Проблемы с построением графиков

Слишком большие размеры

Как правило, функции построения графиков пытаются отображать все полученные данные в виде единой текстуры. Это может привести к ошибкам GL или сбою OpenGL без вывода предупреждения. Чтобы обойти эту проблему, можно разбить график на части (а затем собрать их), что позволит уменьшить размер отдельной текстуры.

Двухмерные графики (тепловые карты, изображения и т. д.)

heatmap(rand(Float32, 24900, 26620))

может давать сбой с выводом ошибки:

   Error showing value of type Scene:
ERROR: glTexImage 2D: width too large. Width: 24900
[...]

либо без нее:

цельная тепловая карта

Разбиение графика на фрагменты, как показано ниже, позволяет получить правильное изображение.

sc = Scene()
data = rand(Float32, 24900, 26620)
heatmap!(sc, 1:size(data, 1)÷2, 1:size(data, 2)÷2, data[1:end÷2, 1:end÷2])
heatmap!(sc, (size(data, 1)÷2 + 1):size(data, 1), 1:size(data, 2)÷2, data[(end÷2 + 1):end, 1:end÷2])
heatmap!(sc, 1:size(data, 1)÷2, (size(data, 2)÷2 + 1):size(data, 2), data[1:end÷2, (end÷2 + 1):end])
heatmap!(sc, (size(data, 1)÷2 + 1):size(data, 1), (size(data, 2)÷2 + 1):size(data, 2),
         data[(end÷2 + 1):end, (end÷2 + 1):end])
фрагментированная тепловая карта

Трехмерные графики (объемы)

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

using Makie, GLMakie, ModernGL
# простой график для открытия окна (должно быть открыто для opengl)
display(scatter(rand(10)))
glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE)

А затем можно просто разделить объем:

vol = rand(506, 720, 1440)
ranges = (1:256, 1:256, 1:256)
scene = volume(ranges..., vol[ranges...])
for i in 1:3
    global ranges
    ranges = ntuple(3) do j
        s = j == i ? last(ranges[j]) : 1
        e = j == i ? size(vol, j) : last(ranges[j])
        s:e
    end
    volume!(ranges..., vol[ranges...])
end
scene

Общие проблемы

Не работает шрифт

Если Makie не удается найти ваш шрифт, есть два варианта действий.

  1. Проверьте, совпадает ли имя и находится ли шрифт в одном из следующих каталогов:

    • using FreeTypeAbstraction; FreeTypeAbstraction.valid_fontpaths

  2. Путь к пользовательскому шрифту можно добавить с помощью переменной среды:

    • ENV["FREETYPE_ABSTRACTION_FONT_PATH"] = "/path/to/your/fonts"

  3. Укажите путь к шрифту; вместо font = "Noto" можно написать joindir(homedir(), "Noto.ttf") или что-то подобное.

Проблемы с макетом

Элементы сжимаются в левый нижний угол

Для блочных элементов требуется ограничивающий прямоугольник, по которому они выравниваются. При добавлении такого элемента в макет ограничивающий прямоугольник контролируется этим макетом. Если вы забыли поместить элемент в макет, у него будет ограничивающий прямоугольник BBox(0, 100, 0, 100) по умолчанию, который окажется в левом нижнем углу. Вы также можете вручную задать ограничивающий прямоугольник, если требуется больше контроля.

using CairoMakie
f = Figure()

ax1 = Axis(f, title = "Squashed")
ax2 = Axis(f[1, 1], title = "Placed in Layout")
ax3 = Axis(f, bbox = BBox(200, 600, 100, 500),
  title = "Placed at BBox(200, 600, 100, 500)")

f
9abf53d

Столбцы или строки сжимаются до размера блока Text или другого элемента

Столбцы или строки, имеющие размер Auto(true), пытаются определить ширину или высоту всех размещенных в них односвязных элементов, и, если какие-либо элементы сообщают макету собственную высоту или ширину, строка или столбец будут сжаты до максимального сообщенного размера. Это делается для того, чтобы небольшие элементы с известным размером занимали лишь столько места, сколько необходимо. Но если в строке есть другое содержимое, которое должно занимать больше места, вы можете задать для проблемного элемента атрибут tellheight = false или tellwidth = false. В результате его высота или ширина не будет влиять на автоматический размер макета. В качестве альтернативы можно установить размер этой строки или столбца равным Auto(false) (или любому другому значению, отличному от Auto(true)).

using CairoMakie
f = Figure()

Axis(f[1, 1], title = "Shrunk")
Axis(f[2, 1], title = "Expanded")
Label(f[1, 2], "This Label has the setting\ntellheight = true\ntherefore the row it is in has\nadjusted to match its height.", tellheight = true)
Label(f[2, 2], "This Label has the setting\ntellheight = false.\nThe row it is in can use\nall the remaining space.", tellheight = false)

f
6d32e54

Содержимое рисунка не соответствует его размеру

В GridLayout все дочернее содержимое подгоняется под доступное пространство. Поэтому размер Figure определяет то, как формируется макет, но макет не влияет на размер Figure.

Это хорошо работает, когда все содержимое настраивается по ширине и высоте, например в случае с объектом Axis, который может уменьшаться или увеличиваться по мере необходимости. Однако ширина, высота или соотношение сторон элемента, строки или столбца могут быть ограничены. Если слишком много элементов имеют такие ограничения, их невозможно подогнать под заданный размер Figure, не оставляя пустого пространства или не обрезая их по краям.

В таком случае можно воспользоваться функцией resize_to_layout!, которая определяет фактический размер основного объекта GridLayout с учетом его содержимого и изменяет размер Figure в соответствии с ним.

Вот пример, где всем объектам Axis присвоены фиксированные ширина и высота. Степеней свободы для алгоритма компоновки макета недостаточно, чтобы правильно вместить все в Figure:

using CairoMakie
set_theme!(backgroundcolor = :gray90)

f = Figure(size = (800, 600))

for i in 1:3, j in 1:3
    ax = Axis(f[i, j], title = "$i, $j", width = 100, height = 100)
    i < 3 && hidexdecorations!(ax, grid = false)
    j > 1 && hideydecorations!(ax, grid = false)
end

Colorbar(f[1:3, 4])

f
142afd1

Как видите, со всех четырех сторон есть пустое пространство, поскольку нет гибких объектов, которые могли бы его заполнить.

Но после запуска resize_to_layout! объект Figure принимает соответствующий размер по осям:

resize_to_layout!(f)
f
9f37340