2009-11-24 9 views
6

Ho un piccolo problema nel far funzionare ggplot2 come voglio. Fondamentalmente, mi piacerebbe confrontare le osservazioni reali e quelle approssimative inserendole in un singolo grafico. Ad esempio,problema con la legenda durante il tracciamento dei dati da due 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) 

Il mio problema è che non riesco a visualizzare una legenda. Ho letto da qualche parte che la leggenda di ggplot2 non è molto flessibile (?). Idealmente, una leggenda con

  • title = 'Tipo'
  • chiave: un punto nero pieno, e una linea nera
  • etichetta del tasto: 'Actual', 'approssimativa'
  • legend.position = 'topright'

Grazie.

risposta

6

Prova questo per ottenere iniziare

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

Grazie Hadley, Mi piacerebbe distinguere la data della trama in bianco e nero. È possibile avere una legenda come ho descritto le cui due chiavi sono un punto e una linea? – knguyen

4

Questa è una sorta di hack per modificare la leggenda dalla manipolazione dell'oggetto griglia:

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

Grazie per l'esempio riproducibile. ggplot2 dovrebbe gestire questo tipo di leggenda automaticamente, quindi aggiungerò questo al mio elenco di cose da fare. – hadley

Problemi correlati