2016-01-25 12 views
9

Niedawno zaktualizowałem do wersji R 3.2.3, a także do wersji ggplot 2.0.0.Ggplot2 różne zachowania alfa

Próba uaktualnienia starego kodu do nowszych wersji Napotkałem dziwne zachowanie z ggplot2 i jego ustawieniami przezroczystości.

Teraz moje pytanie brzmi: czy to błąd, czy funkcja (jeśli tak, czy ktoś może mnie oświecić, dlaczego warto to robić w ten sposób)? Wynik Chcę mieć to (oczywiście) Działka 2.

Say I wykreślić linię i leżał prostokąt z przejrzystością nad nim tak:

library(ggplot2) 

plot_data <- data.frame(x = 1:100, y = rnorm(100)) 

# Plot 1 
ggplot(data = plot_data, aes(x = x, y = y)) + 
    geom_line() + 
    geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf), fill = "red", 
      alpha = 0.1) + ggtitle("Plot 1") 

# Plot 2 
ggplot() + 
    geom_line(data = plot_data, aes(x = x, y = y)) + 
    geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf), fill = "red", 
      alpha = 0.1) + ggtitle("Plot 2") 

mojego rozeznania działki 1 i 2 powinny być identyczne . Jednak mam następujące działki:

Plot 1:

Plot1

i działka 2:

Plot2

Dodatkowo, jeśli bawić z alpha -values ​​(dla przykład ustawiając je na 0.01, otrzymuję dwa następujące działki:

Plot1a

i

Plot2a

+3

w swojej działce 2, jeśli dodać data = plot_data do geom_rect() będzie można uzyskać takie same wyniki jak Plot1 – MLavoie

+0

co jest interesujące, ale nie odzwierciedla alfa 0,1 (zupełnie przezroczyste) do mojego zrozumienia ! – David

Odpowiedz

2

wierzę, że nazywając geom_rect bez parametru data skutecznie wyciągnąć indywidualny prostokąt dla każdego wiersza data.frame dlatego też alpha jest „praca”, ale nie całkiem zgodnie z oczekiwaniami. Nie byłem w stanie powtórzyć i uzyskać parytetu/zgodności między metodami, ale jak zauważyłeś, myślę, że robi coś wzdłuż linii rysowania albo 100 pojedynczych prostokątów, albo 30 (szerokość prostokątów, od 20 do 50), dlatego alpha = 0.1/100 i alpha = 0.1/30 przybliżają Cię, ale nie do końca pasują.

Niezależnie od tego, to pewnie używać annotate, jako że lepiej opisuje zachowanie/wynik staramy się osiągnąć bez problemów i działa zgodnie z oczekiwaniami, w obu przypadkach - annotations będzie narysować pojedynczy instancji za geom:

ggplot(data = plot_data, aes(x = x, y = y)) + 
    # geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf, alpha = 0.1, fill = "red")) + 
    annotate("rect", xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf, alpha = 0.1, fill = "red") + 
    geom_line() + 
    ggtitle("Plot 1") 

ggplot() + 
    geom_line(data = plot_data, aes(x = x, y = y)) + 
    # geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf), fill = "red", alpha = 0.1) + 
    annotate("rect", xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf, fill = "red", alpha = 0.1) + 
    ggtitle("Plot 2") 
+0

Rysowanie 1 prostokąta dla każdego rzędu jest prawdopodobnie przyczyną tego problemu, przynajmniej brzmi to dla mnie wiarygodne! – David

+0

@David znalazł [podobne pytanie tutaj] (http://stackoverflow.com/q/15903868/2572423), które nawiązuje do tej samej logiki/rozumowania; nadal przeszkadza mi to, że nie mogę ich zmusić do "dopasowania". – JasonAizkalns

+0

Natknąłem się również na to [pytanie] (http://stackoverflow.com/questions/17521438/geom-rect-and-alpha-does-this-work-with-hard-coded-values), które wspomina o użyciu tylko jednego wiersz w 'geom_rect' .. – David

Powiązane problemy