2014-05-25 2 views
5

J'essaye de créer un complot dans Julia (utilisant actuellement Gadfly mais je serais disposé à utiliser un paquet différent). J'ai un tableau multidimensionnel. Pour une taille de dimension fixe (par exemple 4875x3x3 une parcelle appropriée serait:Julia traçant un nombre inconnu de couches dans Gadfly

p=Gadfly.plot( 
    layer(y=sim1.value[:,1,1],x=[sim1.range],Geom.line, Theme(default_color=color("red"))), 
    layer(y=sim1.value[:,1,2],x=[sim1.range],Geom.line, Theme(default_color=color("blue"))), 
    layer(y=sim1.value[:,1,3],x=[sim1.range],Geom.line, Theme(default_color=color("green"))) 
) 

mais en général je veux être en mesure d'écrire une déclaration de complot où je ne connais pas la troisième dimension du tableau sim1.value Comment. puis-je écrire une telle déclaration

peut-être quelque chose comme:

p=Gadfly.plot([layer(y=sim1.value[:,1,i],x=[sim1.range], Geom.line, Theme(default_color=color("red"))) for i in 1:size(sim1)[3]]) 

mais cela ne fonctionne pas

j'ai pu résoudre ce problème en réorganisant le tableau. dans une base de données et en ajoutant une colonne pour indiquer quelle est la troisième dimension, mais je me demandais s'il y avait un moyen de le faire sans créer un dataframe.

Les données ressemblent à ceci:

julia> sim1.value 
4875x3x3 Array{Float64,3}: 
[:, :, 1] = 
    0.201974 0.881742 0.497407 
    0.0751914 0.921308 0.732588 
-0.109084 1.06304 1.15962 
-0.0149133 0.896267 1.22897 
    0.717094 0.72558 0.456043 
    0.971697 0.792255 0.40328 
    0.971697 0.792255 0.227884 
-0.600564 1.23815 0.499631 
-0.881391 1.07994 0.59905 
-0.530923 1.00278 0.447363 
    ⋮        
    0.866138 0.657875 0.280823 
    1.00881 0.594015 0.894645 
    0.470741 0.859117 1.09108 
    0.919887 0.540488 1.01126 
    2.22095 0.194968 0.954895 
    2.5013  0.202698 2.05665 
    1.94958 0.257192 2.01836 
    2.24015 0.209885 1.67657 
    0.76246 0.739945 2.2389 
    0.673887 0.640661 2.15134 

[:, :, 2] = 
    1.28742 0.760712 1.61112 
    2.21436 0.229947 1.87528 
-1.66456 1.46374 1.94794 
-2.4864 1.84093 2.34668 
-2.79278 1.61191 2.22896 
-1.46289 1.21712 1.96906 
-0.580682 1.3222 1.45223 
    0.17112 1.20572 0.74517 
    0.734113 0.629927 1.43462 
    1.29676 0.266065 1.52497 
    ⋮       
    1.2871 0.595874 0.195617 
    1.84438 0.383567 1.15537 
    2.12446 0.520074 0.957211 
    2.36307 0.222486 0.402168 
    2.43727 0.19843 0.636037 
    2.33525 0.302378 0.811371 
    1.09497 0.605816 0.297978 
    1.366  0.56246 0.343701 
    1.366  0.56246 0.219561 
    1.35889 0.630971 0.281955 

[:, :, 3] = 
    0.649675 0.899028 0.628103 
    0.718837 0.665043 0.153844 
    0.914646 0.807048 0.207743 
    0.612839 0.790611 0.293676 
    0.759457 0.758115 0.280334 
    0.77993 0.774677 0.396879 
-1.63825 1.38275 0.85772 
-1.43517 1.45871 0.835853 
-1.15413 1.35757 1.05071 
-1.10967 1.37525 0.685986 
    ⋮       
    1.15299 0.561492 0.680718 
    1.14853 0.629728 0.294947 
    1.65147 0.517422 0.22285 
    1.65147 0.517422 0.517451 
    1.78835 0.719658 0.745866 
    2.36554 0.426616 1.49432 
    0.855502 0.739237 1.24224 
-0.175234 0.701025 1.07798 
-0.221313 0.939255 1.3463 
    1.58094 0.368615 1.63817 
+3

Je ne l'ai pas essayé, mais est-ce que "splatting" fonctionne ici? 'p = Gadfly.plot ([calque (y = sim1.value [:, 1, i], x = [sim1.range], Geom.line, Thème (default_color = couleur (" rouge "))) pour i dans 1: size (sim1) [3]] ...) ' – rickhg12hs

+0

L'accrochage fonctionne vraiment! Je vous remercie. Vous pouvez le poster comme une réponse et je peux le sélectionner. Existe-t-il un moyen d'utiliser «i» dans la compréhension pour avoir une séquence de couleurs? – bdeonovic

+0

Une autre option consiste à utiliser 'add_plot_element', voir [cette question] (http://stackoverflow.com/questions/23585327/are-gadfly-plots-currently-composable). –

Répondre

8

Apparemment "splatting", si c'est le terme correct, fonctionne ici. Essayez:

p=Gadfly.plot([layer(y=sim1.value[:,1,i],x=[sim1.range], Geom.line, Theme(default_color=color("red"))) for i in 1:size(sim1)[3]]...) 

Pour différentes couleurs de calque, ceci est juste une conjecture/hack (n'hésitez pas à modifier pour l'exactitude).

p=Gadfly.plot([layer(y=sim1.value[:,1,i],x=[sim1.range], Geom.line, Theme(default_color=color(["red" "blue" "green" "cyan" "magenta" "yellow"][i%6+1]))) for i in 1:size(sim1)[3]]...) 

Peut-être l'un des Scale paramètres de couleur de Gadfly aiderait ici.

Addendum:

Voir le premier commentaire ci-dessous pour la méthode de sélection des couleurs.

+3

Pour les couleurs, j'ai utilisé 'distinguuishable_colors (size (sim1) [3]) [i]' pour obtenir la quantité de couleurs appropriée. – bdeonovic

Questions connexes