Plot 在带有循环的Julia Gadfly绘图中添加多个图层

Plot 在带有循环的Julia Gadfly绘图中添加多个图层,plot,julia,gadfly,Plot,Julia,Gadfly,我尝试在Gadfly plot中绘制多个图层,模式如下: p=plot(yintercept=[0,1,2,3],Geom.hline(color=colorant"darkgray", size=0pt), [ layer( x=locs, y=BS[:,i]+1-1, Geom.line,Theme(default_color=colorant"red") ) for i in ind[1] ] ... , [ layer( x=locs, y=BS[:,i]+2-1, Geom.l

我尝试在Gadfly plot中绘制多个图层,模式如下:

p=plot(yintercept=[0,1,2,3],Geom.hline(color=colorant"darkgray", size=0pt),

 [ layer( x=locs, y=BS[:,i]+1-1, Geom.line,Theme(default_color=colorant"red") ) for i in ind[1] ] ... ,

 [ layer( x=locs, y=BS[:,i]+2-1, Geom.line,Theme(default_color=colorant"red") ) for i in ind[2] ] ... ,

 [ layer( x=locs, y=BS[:,i]+3-1, Geom.line,Theme(default_color=colorant"red") ) for i in ind[3] ] ... ,

 [ layer( x=locs, y=BS[:,i]+4-1, Geom.line,Theme(default_color=colorant"red") ) for i in ind[4] ] ...

) 
using DataFrames: DataFrame, head, stack

my_df = DataFrame(x = collect(1:100));
当m变大时,手动添加层是非常烦人的(目前m最多4层)。所以我想写一个循环,将层添加到当前的plot p

p=plot(yintercept=[0,1,2,3],Geom.hline(color=colorant"darkgray", size=0pt) )

for m=0:M
  q = append!(p.layers, [ layer( x=locs, y=BS[:,i]+m, Geom.line,Theme(default_color=colorant"red") ) for i in ind[m+1] ] ... )
end

循环现在不起作用了。关于如何轻松添加层有什么想法吗?

既然Gadfly的灵感来自于此,那么我们可以使用库并应用
堆栈
功能。考虑以下事项:

p=plot(yintercept=[0,1,2,3],Geom.hline(color=colorant"darkgray", size=0pt),

 [ layer( x=locs, y=BS[:,i]+1-1, Geom.line,Theme(default_color=colorant"red") ) for i in ind[1] ] ... ,

 [ layer( x=locs, y=BS[:,i]+2-1, Geom.line,Theme(default_color=colorant"red") ) for i in ind[2] ] ... ,

 [ layer( x=locs, y=BS[:,i]+3-1, Geom.line,Theme(default_color=colorant"red") ) for i in ind[3] ] ... ,

 [ layer( x=locs, y=BS[:,i]+4-1, Geom.line,Theme(default_color=colorant"red") ) for i in ind[4] ] ...

) 
using DataFrames: DataFrame, head, stack

my_df = DataFrame(x = collect(1:100));
现在假设我们为斜率截距方程的不同斜率值添加列。就是

for i in .1:.1:1.
    my_df[Symbol("line_" * string(i))] = 100 + my_df[:x] * i
end
my_df_stack = DataFrame(x = repeat(my_df[:x], outer = [length(collect(.1:.1:1.))]), 
                        var = stack(my_df[2:end])[1],
                        val = stack(my_df[2:end])[2]);
因此,数据集的标题如下所示:

julia> print(head(my_df))

│ Row │ x │ line_0.1 │ line_0.2 │ line_0.3 │ line_0.4 │ line_0.5 │ line_0.6 │
├─────┼───┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ 1   │ 1 │ 100.1    │ 100.2    │ 100.3    │ 100.4    │ 100.5    │ 100.6    │
│ 2   │ 2 │ 100.2    │ 100.4    │ 100.6    │ 100.8    │ 101.0    │ 101.2    │
│ 3   │ 3 │ 100.3    │ 100.6    │ 100.9    │ 101.2    │ 101.5    │ 101.8    │
│ 4   │ 4 │ 100.4    │ 100.8    │ 101.2    │ 101.6    │ 102.0    │ 102.4    │
│ 5   │ 5 │ 100.5    │ 101.0    │ 101.5    │ 102.0    │ 102.5    │ 103.0    │
│ 6   │ 6 │ 100.6    │ 101.2    │ 101.8    │ 102.4    │ 103.0    │ 103.6    │

│ Row │ line_0.7 │ line_0.8 │ line_0.9 │ line_1.0 │
├─────┼──────────┼──────────┼──────────┼──────────┤
│ 1   │ 100.7    │ 100.8    │ 100.9    │ 101.0    │
│ 2   │ 101.4    │ 101.6    │ 101.8    │ 102.0    │
│ 3   │ 102.1    │ 102.4    │ 102.7    │ 103.0    │
│ 4   │ 102.8    │ 103.2    │ 103.6    │ 104.0    │
│ 5   │ 103.5    │ 104.0    │ 104.5    │ 105.0    │
│ 6   │ 104.2    │ 104.8    │ 105.4    │ 106.0    │
现在我们画x和10条线。为此,我们需要堆叠这些行的列。就是

for i in .1:.1:1.
    my_df[Symbol("line_" * string(i))] = 100 + my_df[:x] * i
end
my_df_stack = DataFrame(x = repeat(my_df[:x], outer = [length(collect(.1:.1:1.))]), 
                        var = stack(my_df[2:end])[1],
                        val = stack(my_df[2:end])[2]);
所以,

julia> print(head(my_df_stack))

6×3 DataFrames.DataFrame
│ Row │ x │ var      │ val   │
├─────┼───┼──────────┼───────┤
│ 1   │ 1 │ line_0.1 │ 100.1 │
│ 2   │ 2 │ line_0.1 │ 100.2 │
│ 3   │ 3 │ line_0.1 │ 100.3 │
│ 4   │ 4 │ line_0.1 │ 100.4 │
│ 5   │ 5 │ line_0.1 │ 100.5 │
│ 6   │ 6 │ line_0.1 │ 100.6 │
最后,绘制如下所示:

using Gadfly
Gadfly.push_theme(:dark)

plot(my_df_stack, x = :x, y = :val, group = :var, Geom.line)


我通常通过预先分配一个层向量(我使用循环构建)来完成,然后通过对层向量进行铺展来调用plot命令,即
plot(vectorLayers…
)。我不确定你是否可以像你一样动态地将图层添加到一个预先存在的绘图对象中(希望有更了解情况的人会来),但是这种飞溅的技巧是有效的。。。