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
макрос для каждой из других веток кода.