Julia Plots.jl: изменение цвета маркера из серийного рецепта

Я пытаюсь собрать Plots.jl пользовательский рецепт, который будет создавать несколько графиков рассеяния и гистограмм, расположенных в виде сетки. Графики рассеяния должны занимать нижний треугольник сетки. Гистограммы идут по диагонали. Каждый точечный график должен иметь несколько серий, показанных разными цветами. Цвета должны быть одинаковыми на разных участках.

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

Вот (сокращенный) код рецепта. data это вектор размера r, Каждый элемент data это матрица размера n_r x d, n_r может различаться, d остается такой же. Там должен быть d x (d-1) / 2 точечные участки, с r серия на каждом участке, каждая серия имеет n_r точки.

@recipe function my_func(data::my_type; custom_colors=nothing)
    # get d, r, ...
    for i in i:d
        for j in 1:d
            @series begin
                subplot := (i - 1) * d + j
                if i == j
                    seriestype := :histogram
                    plot_data = # ... prepare data for histograms
                elseif j < i
                    # scatter subplot recipe
                    seriestype := :scatter
                    if custom_colors !== nothing
                        color := reshape(custom_colors, (1, r))
                    end
                    x = Vector()
                    y = Vector()
                    for r in runs
                        ser = data[r]
                        append!(x, [ser[:, j]])
                        append!(y, [ser[:, i]])
                    end # for r
                    plot_data = (x, y)
                else
                    # leave empty
                    plot_data = [0]
                end #  if/else
                plot_data  # return from the macro function
            end # @series
        end # for j
    end # for i
end # @recipe

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

plot(my_data, custom_colors=["blue", "green", "black"])

сюжет с нестандартными цветами

Обратите внимание, что подзаговор (2, 1) имеет черные точки посередине, в то время как все остальные вспомогательные участки имеют черные снаружи

Если я делаю сюжет без пользовательских цветов:

plot(my_data)

Я получаю одинаковые цвета на всех участках разброса:

Любые подсказки, почему цвета смешиваются на первом сюжете?

1 ответ

Решение

Хорошо, получается, что хитрость в том, что каждая серия на каждом точечном графике должна быть построена со своим собственным макросом. Другими словами, @series ... end должен идти внутрь for r in runs ... end, И отдельный @series макрос для каждой из других веток кода.

Другие вопросы по тегам