2009-11-24 4 views
6

Je vais avoir un peu de mal à faire fonctionner ggplot2 comme je veux. Fondamentalement, je voudrais comparer les observations réelles contre approximées en les mettant dans un seul complot. Par exemple,problème avec la légende tout en traçant des données de deux data.frame

> library(ggplot2) 
> df.actual <- data.frame(x = 1:100, y = (1:100) * 2) 
> df.approx <- data.frame(x = 1:150, y = (1:150) * 2 + 5 + rnorm(150, mean = 3)) 
> ggplot() + geom_point(aes(x, y), data = df.actual) + geom_line(aes(x,y), data = df.approx) 

Mon problème est que je ne peux pas afficher une légende. J'ai lu quelque part que la légende de ggplot2 n'est pas très flexible (?). Idéalement, une légende avec

  • title = 'Type'
  • clé: un point rempli de noir, et une ligne noire
  • étiquette clé: 'réelle', 'approximative'
  • legend.position = 'topright'

Merci.

Répondre

6

Essayez ceci pour vous aider à démarrer

ggplot() + 
    geom_point(aes(x, y, colour = "actual"), data = df.actual) + 
    geom_line(aes(x, y, colour = "approximate"), data = df.approx) + 
    scale_colour_discrete("Type") 
+1

Merci hadley, Je voudrais distinguer l'intrigue noire et blanche de date. Est-il possible d'avoir une légende comme je l'ai décrit dont les deux clés sont un point et une ligne? – knguyen

4

Ceci est une sorte de hack pour modifier la légende par la manipulation de l'objet de la grille:

library("ggplot2") 
df.actual <- data.frame(x=1:100, y=(1:100)*2) 
df.approx <- data.frame(x=1:150, y=(1:150)*2 + 5 + rnorm(150, mean=3)) 
p <- ggplot() + 
    geom_point(aes(x, y, colour="Actual"), data=df.actual) + 
    geom_line(aes(x, y, colour="Approximate"), data=df.approx) + 
    scale_colour_manual(name="Type", 
         values=c("Actual"="black", "Approximate"="black")) 
library("grid") 
grob <- ggplotGrob(p) 
tmp <- grid.ls(getGrob(grob, "key.segments", grep=TRUE, global=TRUE))$name 
grob <- removeGrob(grob, tmp[1]) # remove first line segment in legend key 
tmp <- grid.ls(getGrob(grob, "key.points", grep=TRUE, global=TRUE))$name 
grob <- removeGrob(grob, tmp[2]) # remove second point in legend key 
grid.draw(grob) 

ggplot2 output http://img134.imageshack.us/img134/8427/ggplotlegend.png

+0

Merci pour l'exemple reproductible. ggplot2 devrait gérer ce type de légende automatiquement, donc je vais l'ajouter à ma liste de tâches. – hadley