2017-01-08 2 views
1

Ich versuche Hinzufügen mehrerer Schichten in Gadfly Plot mit einem Muster zu zeichnen, wie folgend:mehrere Schichten in Julia Gadfly Grundstück mit Schlaufen

p = Grundstück (Y-Achsenabschnitt = [0,1,2,3], Geom .hline (Farbe = Farbstoff "dunkelgrau", Größe = 0pt),

[Schicht (x = locs, y = BS [:, i] + 1-1, Geom.line, Thema (default_color = Farbstoff "rot ") für i in ind [1]] ...,

[Schicht (x = locs, y = BS [:, ich] + 2-1, Geom.line, Theme (default_color = Farbstoff" rot ")) für i in ind [2]] ...,

[Schicht (x = locs, y = BS [:, i] + 3-1, Geom.line, Theme (default_color = Farbstoff "rot")) für i in ind [3]] ...,

[Schicht (x = locs, y = BS [:, i] + 4-1, Geom.line, Theme (default_color = Färbemittel "red")) für i in ind [4]] ...

)

Es ist ziemlich nervig, Layer manuell hinzuzufügen, wenn m groß wird (derzeit ist m bis zu 4). Ich möchte also eine Schleife schreiben, um dem aktuellen Plot p Ebenen hinzuzufügen.

p = plot (Y-Achsenabschnitt = [0,1,2,3], Geom.hline (Farbe = Farbmittel "dunkelgrau" size = 0 pt))

für m = 0: M

q = append! (p.layers, [Ebene (x = locs, y = BS [:, i] + m, Geom.line, Thema (default_color = Farbmittel "rot")) für i in ind [m + 1] ] ...) Ende

Die Schleife funktioniert jetzt nicht. Irgendwelche Ideen, wie man die Ebenen leicht hinzufügen kann?

+1

Normalerweise mache ich dies, indem ich einen Vektor von Layern vorprogrammiere (den ich mit einer Schleife erstelle) und dann den Plot-Befehl durch Aufspalten des Vektors der Ebenen, d. H. 'Plot (vectorLayers ...) ', aufruft.Ich bin mir nicht sicher, ob du dynamisch Layern zu einem bereits existierenden Plot-Objekt hinzufügen kannst (hoffentlich wird jemand mit mehr Wissen kommen), aber der Splatter-Trick funktioniert ... –

Antwort

1

Da Gadfly von ggplot2 inspiriert ist, können wir die DataFrames Bibliothek verwenden und die stack Funktion anwenden. Berücksichtigen Sie folgendes:

using DataFrames: DataFrame, head, stack 

my_df = DataFrame(x = collect(1:100)); 

Nehmen wir nun an, wir fügen Spalten für verschiedene Steigungswerte der Steigung-Schnittpunkt-Gleichung hinzu. Das heißt,

for i in .1:.1:1. 
    my_df[Symbol("line_" * string(i))] = 100 + my_df[:x] * i 
end 

Damit der Kopf unseres Datensatzes ist unten angegeben:

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 │ 

Jetzt sind wir dann Plot x und die 10 Linien. Um dies zu tun, müssen wir die Spalten dieser Linien stapeln. Das heißt,

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]); 

Damit,

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 │ 

Schließlich wird die Handlung geschieht wie folgt:

using Gadfly 
Gadfly.push_theme(:dark) 

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

enter image description here oder

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

enter image description here

Verwandte Themen