2013-07-08 10 views
28

Ten sam tytuł, jednak całkowicie przeformułowany.geom_rect i alpha - czy to działa z wartościami zakodowanymi?

Dlaczego alfa działa na pierwszym wykresie, ale nie na drugim? Próbuję zobaczyć, dlaczego z wartościami zakodowanymi, rect jest narysowany we właściwym miejscu, ale nie jest przezroczysty, ale kiedy w data.frame działa zgodnie z oczekiwaniami?

mtcars$cyl <- factor(mtcars$cyl) 
mtcars$am <- factor(mtcars$am) 

ggplot(mtcars) + 
    geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    geom_rect(data=data.frame(xmin=100, xmax=200, ymin=0, ymax=Inf), aes(xmin=xmin, xmax=xmax, ymin=ymin,ymax=ymax), fill="red", alpha=0.2) 

ggplot(mtcars) + 
    geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    geom_rect(aes(xmin=100, xmax=200, ymin=0,ymax=Inf), fill="red", alpha=0.2) 

Odpowiedz

56

Dzięki za wyjaśnienie Twoje pytanie. To było dla mnie zagadkowe, więc poszedłem do google i skończyłem na learning something new (po obejrzeniu kilku kaprysów w ich przykładach). Najwyraźniej to, co robicie, polega na rysowaniu wielu prostokątów jeden na drugim, skutecznie niwelując pożądaną półprzezroczystość. Więc jedyne sposoby przezwyciężenia tego są do ciężkiej kodu prostokąt koordynuje w oddzielnym df, albo ...

ggplot() + 
    geom_density(data=mtcars, aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    geom_rect(aes(xmin=100, xmax=200, ymin=0,ymax=Inf), alpha=0.2, fill="red") 

... po prostu nie przypisać data.frame globalnie do działki. Zamiast tego używaj go tylko w żądanych warstwach (w tym przykładzie: geom_density) i pozostaw pozostałe warstwy bez df! Lub nawet jeszcze lepiej, użyj annotate zmodyfikować wykres spod domyślnej DF:

ggplot(mtcars) + 
    geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    annotate("rect", xmin=100, xmax=200, ymin=0, ymax=Inf, alpha=0.2, fill="red") 

Ta ostatnia metoda pozwala na korzystanie z jednego data.frame dla całej fabuły, więc nie trzeba określ ten sam df dla każdej warstwy.

Obie metody powrotu identyczne wykresy:

enter image description here

+2

Wystarczy dodać do tego. Jeśli używasz tego w połączeniu z scale_y_continuous (powiedzmy limits = c (0.005,0.015), więc dokładnie określ punkty przerwania, nie możesz mieć (ymin = 0, ymax = Inf), twoje wartości min/max muszą spaść w granicach skali – nzcoops

+0

+1 To wyjaśnia wszystkie problemy ze specyfikacją alfa, jakie kiedykolwiek miałem z ggplot! – geotheory

+1

To jest świetne! Ale nadal nie rozumiem, dlaczego 'geom_rect (..., alpha = .1)' doesn 't pracy, ale 'adnotacja (" rect ", ... alpha = .1)' does. – Stuart

1
ggplot(df, aes(xmin = x, xmax = x + 1, ymin = y, ymax = y + 2)) + 
    geom_rect(alpha=.2) + 
    geom_rect(data=data.frame(xmin=3, xmax=6, ymin=3, ymax=5), 
      aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax), 
      fill="green", alpha=.2) 
+0

Dzięki @ user2559998. Zabawiam się z tym. Nadal nie widzę, jak to się różni od twardego kodowania wartości:/ – nzcoops

7

Innym rozwiązaniem jest dać geom_rect jeden wiersz danych obiektów w celu zapewnienia tylko jeden prostokąt uwagę:

ggplot(mtcars) + 
    geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    geom_rect(data=mtcars[1,], aes(xmin=100, xmax=200, ymin=0,ymax=Inf), fill="red", alpha=0.2) 

enter image description here

+0

Jest to rozwiązanie, którego szukasz, jeśli jesteś facetem. – Nova

Powiązane problemy