2017-01-08 5 views
1

Я пытаюсь построить несколько слоев в Овод участке с рисунком следующим образом:Добавление нескольких слоев Юлия Овод участок с петлями

р = участок (yintercept = [0,1,2,3], геом .hline (color = colorant "darkgray", size = 0pt),

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

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

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

[layer (x = LOCS, у = БС [:, I] + 4-1, Geom.line, Тема (default_color = краситель "красный")) для г в Ind [4]] ...

)

Очень грустно добавлять слои вручную, когда m становится большим (в настоящее время m до 4). Поэтому я хочу написать цикл, чтобы добавить слои к текущему сюжету p.

р = участок (yintercept = [0,1,2,3], Geom.hline (цвет = краситель "DarkGray", размер = 0pt))

при т = 0: M

q = append! (p.layers, [layer (x = locs, y = BS [:, i] + m, Geom.line, Theme (default_color = colorant "red")) для i в ind [m + 1] ] ...) конец

Петля теперь не работает. Любые идеи о том, как легко добавлять слои?

+1

Обычно я делаю это путем предварительного выделения вектора слоев (который я строю с использованием цикла), а затем вызова команды plot путем разбиения вектора слоев, т. Е. 'Plot (vectorLayers ...)'.Я не уверен, что вы можете динамически добавлять слои к предварительно существующему сюжетному объекту, как и у вас (надеюсь, кто-то еще более осведомлен будет приходить вместе), но трюк splatting работает ... –

ответ

1

Поскольку Gadfly вдохновлен ggplot2, мы можем использовать библиотеку DataFrames и применить функцию stack. Рассмотрим следующее:

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 

Так что глава нашего набора данных приводится ниже:

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 │ 

Теперь мы тогда участок х и 10 строк. Для этого нам нужно уложить столбцы этих строк. То есть,

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) 

enter image description here или

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

enter image description here