2012-07-13 16 views
7

Voglio evidenziare i punti selezionati e ho riscontrato un comportamento strano. Prima alcuni dati fittizi:r - ggplot2 - evidenziando punti selezionati e comportamento strano

a <- 1:50 
b <- rnorm(50) 
mydata <- data.frame(a=a,b=b) 
ggplot(mydata,aes(x=a,y=b)) + geom_point() 

Questo funziona correttamente. Ora, per evidenziare alcuni punti, aggiungo un'altra geom_point strato:

ggplot(mydata[20:40,],aes(x=a,y=b)) + 
    geom_point() + 
    geom_point(aes(x=a[c(10,12,13)],y=b[c(10,12,13)]),colour="red") 

Nota che sto visualizzando solo una gamma limitata di dati ([20:40]). Ora arriva lo strano comportamento:

ggplot(mydata[10:40,],aes(x=a,y=b)) + 
    geom_point() + 
    geom_point(aes(x=a[c(10,12,13)],y=b[c(10,12,13)]),colour="red") 

Modifica delle dimensioni dell'intervallo selezionato, ottengo un errore, approssimativamente tradotto dal tedesco: Error...: Arguments implying different number of rows. Stranamente, questo varia con l'intervallo selezionato. [23:40] funzionerà, [22:40] no.


L'errore in inglese è:

Error in data.frame(x = c(19L, 21L, 22L), y = c(0.28198, -0.6215, : 
    arguments imply differing number of rows: 3, 31 
+0

Spero che non ti dispiaccia, ma ho aggiunto l'errore in inglese – csgillespie

risposta

22

Se i dati sono diversi tra i diversi strati, allora è necessario specificare i nuovi dati per ogni strato.

A tale scopo, con l'argomento data=... per ogni geom che ha bisogno di dati diversi:

set.seed(1) 
mydata <- data.frame(a=1:50, b=rnorm(50)) 
ggplot(mydata,aes(x=a,y=b)) + 
    geom_point(colour="blue") + 
    geom_point(data=mydata[10:13, ], aes(x=a, y=b), colour="red", size=5) 

enter image description here

+0

Ebbene, i dati non sono in realtà diverse, solo un sottoinsieme diverso. Ma questa soluzione è almeno stabile. Funziona solo con denominazione esplicita ('data = ...'). Ma nessuna spiegazione per quello strano errore ... – lambu0815

+0

@ lambu0815 Il fatto che sia un sottoinsieme diverso lo rende diverso. Hai avuto uno strano errore perché hai provato a mappare un singolo elemento estetico (x) a tre elementi diversi. L'estetica deve essere mappata ai nomi delle colonne. Inoltre, non è necessario denominare esplicitamente l'argomento 'data = ...', ma è necessario disporre degli argomenti nell'ordine corretto, ad esempio 'geom_point (aes (...), data, ...)' – Andrie

0

Un'altra opzione di aggiungere le condizioni per entrambi gli attributi, colore e dimensione, all'interno geom_point. Quindi controlliamo manualmente quelli che usano rispettivamente scale_colour_manual e scale_size_manual.

set.seed(1) 
mydata <- data.frame(a = 1:50, b = rnorm(50)) 
ggplot(mydata) + 
    geom_point(aes(x = a, y = b, colour = a > 9 & a < 14, size = a > 9 & a < 14)) + 
    scale_colour_manual(values = c("blue", "red")) + 
    scale_size_manual(values =c(1, 4))+ 
    theme(legend.position = "none") 

enter image description here