2013-02-10 2 views
4

Je voudrais externaliser mes mises en page dans ggplot2 car mon code est très encombré. Disons que j'ai une disposition donnée que j'applique sur plusieurs parcelles dans différentes fonctions. Il ressemble à ceci:Externalisation de la disposition de code dans ggplot

scale_fill_gradientn(guide="colourbar",colours=costum.colorbar_sand.blue.green)+ 
     theme (legend.title = element_text(size = 15,family="Arial"))+ 
     theme (legend.text = element_text(size = 12,family="Arial",angle=45))+ 
     theme (legend.position = "bottom")+ 
     coord_map(projection="mercator"); 

Je voudrais le mettre un fichier externe ou dans un objet, puis l'appeler dans ma fonction de complot.

J'ai essayé read_chunk du knitr package comme ceci: J'ai enregistré le code vide comme ci-dessus dans un fichier R, puis j'ai essayé de l'implémenter dans ma fonction. Par conséquent je l'ai juste écrit dans la fonction comme ceci

function.xy(...){...some ggplot function... 
    read_chunk("some\path") 
    } 

Mais ça ne marche pas. J'ai également essayé paste(read_chunk("some\path")) mais cela ne fonctionne pas. Une autre idée que j'avais était de le sauvegarder en tant qu'objet et de simplement coller le texte mais cela ne fonctionnait pas aussi bien parce que je ne sais pas comment l'enregistrer en tant qu'objet texte (s'il y a quelque chose comme ca). Quelqu'un peut-il me conseiller sur la façon de faire cela?

+0

Si vous sauvegardez les changements de thème dans 'file.R', vous y accédez par' source ("path_to_file.R") '. Avez-vous essayé cela? –

+1

Remarque: vous n'avez pas besoin de retaper 'theme()' pour chaque option. Vous pouvez simplement utiliser des virgules pour séparer les paramètres supplémentaires de l'appel 'theme (..., ..., ...)' d'origine. –

Répondre

4

Vous pouvez externaliser le code de disposition en un segment séparé. Voir example 083 (et ses output) dans le référentiel knitr-examples. La clé est des références de morceaux via <<>>.

+0

Vous avez pensé à tout ce n'est pas vous! –

+1

@BrandonBertelsen haha, je recueille juste des exemples et des solutions que les utilisateurs posent des questions afin qu'il y ait un endroit central pour apprendre toutes les astuces. –

5

Je fais cela de deux façons. Dans mon dossier à tricoter, je déclare les options de complot que je sais allons utiliser fréquemment, l'enregistrement des éléments regroupés dans une liste, comme suit:

plot.option1 <- list(scale_fill_gradient(guide="colourbar",colours=costum.colorbar_sand.blue.green), 
        theme(legend.title = element_text(size = 15,family="Arial"), 
          legend.text = element_text(size = 12,family="Arial",angle=45), 
          legend.position = "bottom"), 
        coord_map(projection="mercator")) 

Ensuite, il est juste une question de annexant + plot.option1

par exemple:

ggplot(dat, aes(x,y)) + plot.option1 

Si vous avez beaucoup d'entre eux (disons pour les thèmes d'entreprise), vous pouvez tout aussi facilement les mettre dans un scénario séparé et la source puis à la tête de votre fichier à tricoter.

exemple minimal:

plot.opt <- list(scale_color_brewer(palette="Blues")) 
ggplot(diamonds, aes(carat, price, color=color)) + geom_point() + plot.opt 
+0

travaillé aussi. très agréable. Merci! – Joschi

2

Une autre option tout à fait semblable à celui de @ brandon-Bertelsen est de créer une fonction personnalisée:

add.my.layout <- function(g) { 
    g + scale_fill_gradientn(guide="colourbar",colours=costum.colorbar_sand.blue.green)+ 
     theme (legend.title = element_text(size = 15,family="Arial"))+ 
     theme (legend.text = element_text(size = 12,family="Arial",angle=45))+ 
     theme (legend.position = "bottom")+ 
     coord_map(projection="mercator") 
} 

Et puis dans votre code, vous pouvez juste faire:

myggplot <- ggplot(...) 
add.my.layout(myggplot) 

Vous pouvez de affinez vos fonctions dans les fichiers R externes si vous le souhaitez.

+0

Juste une note, les fonctions qui n'ont pas de valeur spécifique return() peuvent être problématiques.Personnellement, je voudrais enregistrer dans une variable et retourner (variable) pour plus de clarté. –

+0

Eh bien, j'ai lu qu'il y a des avantages de vitesse de ne pas envelopper votre résultat en retour, c'est pourquoi j'ai tendance à le faire de cette façon ... – juba

+0

+1 parce que c'est si simple. J'aurais dû le savoir. :) – Joschi

Questions connexes