2015-06-09 15 views
6

Utilizzare geom_point con position_jitterdodge funziona solo quando si imposta il riempimento estetico. Non riesco a capire perché dovrebbe essere così!r/ggplot - Usa position_jitterdodge senza un riempimento estetico

Questo comando

library(ggplot2) 
ggplot(diamonds[ sample(nrow(diamonds), 1000), ], 
     aes(x = cut, y = carat, color = clarity)) + 
    geom_point(shape = 21, position = position_jitterdodge()) 

genera un errore:

Error: position_jitterdodge requires the following missing aesthetics: fill 

questo funziona, però:

ggplot(diamonds[ sample(nrow(diamonds), 1000), ], 
     aes(x = cut, y = carat, fill = clarity)) + 
    geom_point(shape = 21, position = position_jitterdodge()) 

enter image description here

semplicemente fornendo un valore NA a riempimento non è una soluzione praticabile:

ggplot(diamonds[ sample(nrow(diamonds), 1000), ], 
     aes(x = cut, y = carat, color = clarity, fill=NA)) + 
    geom_point(shape = 21, position = position_jitterdodge()) 

> Error in seq.default(h[1], h[2], length = n) : 
    'to' cannot be NA, NaN or infinite 

Anche se funziona se si specifica una costante arbitraria (perdonare i risultati orribili):

ggplot(diamonds[ sample(nrow(diamonds), 1000), ], 
     aes(x = cut, y = carat, color = clarity, fill='constant')) + 
    geom_point(shape = 21, position = position_jitterdodge()) 

enter image description here

Tutte le idee su come utilizzare il jitter/schivare senza specificare il riempimento? (vale a dire solo punti colorati)

Modifica: oltre al commento di @ joran, mi piacerebbe sovrapporre i punti sui grafici a scatole. Dal momento che non si intende necessariamente utilizzare fill per differenziare i boxplot, sarebbe bello se i grafici inseriti fossero geom_point(position=position_jitterdodge()) senza fill. Forse non al momento possibile, però ...

#This doesn't work: 
ggplot(diamonds[ sample(nrow(diamonds), 1000), ], 
     aes(x = cut, y = carat, color = clarity)) + 
    geom_boxplot() + 
    geom_point(shape = 21, position = position_jitterdodge()) 

#This does, although obviously no one wants a plot like this 
ggplot(diamonds[ sample(nrow(diamonds), 1000), ], 
     aes(x = cut, y = carat, color = clarity, fill='constant')) + 
    geom_boxplot() + 
    geom_point(shape = 21, position = position_jitterdodge()) 

#This is way it's intended to work, but marries you to 'fill' 
ggplot(diamonds[ sample(nrow(diamonds), 1000), ], 
     aes(x = cut, y = carat, fill = clarity)) + 
    geom_boxplot() + 
    geom_point(shape = 21, position = position_jitterdodge()) 
+2

E non è un bug. Le origini di questa _feature_ erano la necessità specifica di posizionare i punti sopra i diagrammi di caselle schivate che sono stati schivati ​​tramite 'fill' (che è chiaramente indicato nella documentazione di'? Position_jitterdodge'). Sono d'accordo che sarebbe bello se funzionasse senza i grafici, ma questo è solo un caso d'uso inatteso, non un bug. – joran

+0

In realtà, la sovrapposizione sui boxplot è esattamente ciò che sto cercando di fare, anche se nel mio caso i boxplot sono stati schivati ​​dal colore. Ho omesso questo dall'esempio minimo sopra bc, non sembra rilevante, ma lo aggiungerò di nuovo. – arvi1000

+2

Posso farlo funzionare foraggiando ggplot2 e semplicemente modificando 'position_jitterdodge' da usare per usare' colour' piuttosto che fill. Ma non sono sicuro di come scrivere questa funzione (almeno, come scrivere bene) per gestire entrambi i casi. – joran

risposta

4

Ok, ecco la mia soluzione. Specificare fill insieme con l'estetica si vuole veramente (color nel mio caso), poi occultare riempire con scale_fill_manual

Ho prodotto un set di dati falsi diversa che è più simile al mio caso d'uso effettivo, dal momento che i dati di diamanti, come specificato sopra isn' t davvero un buon candidato per la scatola + punti

my_dat <- data.frame(class=factor(rep(1:2, 600)), 
        y=rnorm(1200)), 
        x=rep(letters[1:3], each=400)) 

ggplot(my_dat, aes(x=x, y=y, fill=class, color=class)) + 
    geom_boxplot(outlier.shape = NA) + 
    geom_point(shape = 21, alpha = 0.5, position=position_jitterdodge()) + 
    scale_fill_manual(values = rep(NA, 2)) 

enter image description here

Problemi correlati