2015-06-09 20 views
6

Używanie geom_point z position_jitterdodge działa tylko po ustawieniu estetyki wypełnienia. Nie rozumiem, dlaczego tak powinno być!r/ggplot - Użyj position_jitterdodge bez estetyki wypełnienia

Polecenie

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

Produkuje błąd:

Error: position_jitterdodge requires the following missing aesthetics: fill 

To działa, choć:

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

enter image description here

prostu dostarczanie wartości na to wypełnienie nie jest realną obejście:

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 

Chociaż to działa jeśli podasz dowolny stały (odpuszczania ohydne wyniki):

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

Wszelkie pomysły, w jaki sposób korzystać z jitter/dodge bez określania wypełnienia? (tj. tylko kolorowe punkty)

Edycja: w odpowiedzi na komentarz @ jorana, chciałbym nakładać punkty na działki. Ponieważ jeden nie musi używać fill do rozróżniania działek, byłoby dobrze, gdyby geom_point(position=position_jitterdodge()) zajmował działki bez fill. Może nie jest to obecnie możliwe, ale ...

#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

to nie jest błąd. Początkiem tej cechy była specyficzna potrzeba umieszczenia punktów na unikniętych polach pudełek, które zostały uchylone przez "wypełnienie" (co jest wyraźnie wymienione w dokumentacji w '? Position_jitterdodge'). Zgadzam się, byłoby miło, gdyby działało bez pudełkowych działek, ale to tylko nieprzewidziany przypadek użycia, a nie błąd. – joran

+0

W rzeczywistości, nakładanie się na boxplots jest dokładnie tym, co zamierzam zrobić, chociaż w moim przypadku na kartony zostały uchylone przez kolor. Pominąłem to z minimalnego przykładu powyżej bc, który nie był odpowiedni, ale dodam go z powrotem. – arvi1000

+2

Mogę go uruchomić poprzez rozwidlenie ggplot2 i po prostu edytując 'position_jitterdodge', aby użyć' colour' zamiast wypełnienia. Ale nie jestem pewien, jak byś napisał tę funkcję (przynajmniej, jak to dobrze napisać), aby poradzić sobie w obu przypadkach. – joran

Odpowiedz

4

OK, oto moje obejście problemu. Określ fill wraz z estetyką naprawdę chcesz (color w moim przypadku), a następnie puste się wypełnić scale_fill_manual

wyprodukowałem inny fałszywy zbiór danych, który jest bardziej podobny do mojego rzeczywistego przypadku użycia, ponieważ dane diamenty podanymi powyżej ISN” t naprawdę dobrym kandydatem do skrzynki + punkty

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

Powiązane problemy