2016-12-17 12 views
2

Я хочу сделать набор подзаговоров из многомерного массива, используя Brullo's Julia Plots. Эта функция plot принимает вход varargs и превращает их в подзаголовки, но я не могу, кажется, правильно кормить свой массив и, вероятно, не замечаю ничего простого. Например, с массивом a:Как создать произвольное количество подзаговоров в сюжетах Julia

a = randn(5,5,8) 
a = a.-mean(a) 
a = a./maximum(extrema(a)) 

Если я хочу построить некоторые из 5х5 ломтиков как тепловые карты, я могу сделать:

plot(heatmap(a[:,:,1], aspect_ratio=:equal, clims=(-1,1), title=string(1)), 
heatmap(a[:,:,2], aspect_ratio=:equal, clims=(-1,1), title=string(2)), 
heatmap(a[:,:,3], aspect_ratio=:equal, clims=(-1,1), title=string(3))) 

, который производит:

array of 3 heatmaps

но если я хочу сделать все восемь (или переменное число, которое является моей целью), я не могу заставить его работать с циклом или splat. Я попробовал последний создать кортеж, но получил ошибку:

plot(tuple([heatmap(a[:,:,i], aspect_ratio=:equal, clims=(-1,1)) for i in 1:8]...)) 

LoadError: MethodError: Cannot `convert` an object of type String to an object of type MethodError 
This may have arisen from a call to the constructor MethodError(...), 
since type constructors fall back to convert methods. 
while loading In[1], in expression starting on line 1 

Какой лучший подход здесь?

ответ

3

Я думаю, что самый простой способ - сделать отдельные сюжеты, а затем собрать их вместе в конечном сюжете. Вы можете сделать массив участков в цикле:

plot_array = Any[] # can type this more strictly 
for i in 1:n 
    push!(plot_array,plot(...)) # make a plot and add it to the plot_array 
end 
plot(plot_array...) 

это работает, потому что настройки

p1 = plot(...) 
p2 = plot(...) 
plot(p1,p2) 

создает участок с подзаговорами p1 и p2, и поэтому мы просто использовать, что с произвольным количеством участков. Вы также можете установить макеты здесь, хотя это может быть сложнее с произвольными суммами.

+1

Спасибо, что помогли мне получить мою голову прямо. Ключ непосредственно разбивает массив. Поэтому, изменяя мою попытку: «plot ([heatmap (a [:,:, i], aspect_ratio =: equal, clims = (- 1,1)) для i в 1: 8] ...)' будет работать с тех пор splat [разделяет аргументы в вызовах функций] (http://docs.julialang.org/en/stable/manual/faq/#splits-one-argument-into-many-different-arguments-in-function-calls). – ultradian