如何在Julia Plots中创建任意数量的子图

时间:2016-12-17 06:33:24

标签: julia heatmap subplot plots.jl

我想使用Breloff的Julia Plots从多维数组中制作一组子图。这个绘图函数采用varargs输入并使它们成为子图,但我似乎无法正确地提供我的数组并且可能忽略了一些简单的事情。例如,使用数组a

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

如果我想绘制一些5x5切片作为热图,我可以这样做:

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

这里最好的方法是什么?

1 个答案:

答案 0 :(得分: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创建一个图,因此我们只使用任意数量的图。您也可以在此处设置布局,但使用任意数量可能会更加困难。