2016-03-01 8 views
7

Z zazdrością i podziwem przyglądałem się rozmaitym animacjom ggplot pojawiającym się na twitterze, odkąd David Robinson wydał swój pakiet gganimate i myślałem, że sam będę grał. Mam problem z gganimate podczas korzystania z geom_bar. Mamy nadzieję, że poniższy przykład pokazuje problem.problem gganimate z geom_bar?

najpierw wygenerować pewne dane dla powtarzalny przykład:

df <- data.frame(x = c(1, 2, 1, 2), 
       y = c(1, 2, 3, 4), 
       z = c("A", "A", "B", "B")) 

Aby wykazać, co usiłuję zrobić myślałem byłoby wykreślić zwykły ggplot, szlifowanych przez z. Próbuję pobudzić gganimate do wytworzenia gifa, który zmienia się pomiędzy tymi dwoma działkami.

ggplot(df, aes(x = x, y = y)) + 
    geom_bar(stat = "Identity") + 
    facet_grid(~z) 

facetted_barchart

Ale gdy używam gganimate wykres dla B zachowuje się dziwnie. W drugiej ramce pręty zaczynają się od wartości, w których kończą się pręty pierwszej ramki, a nie od początku. Jakby był to skumulowany wykres słupkowy.

p <- ggplot(df, aes(x = x, y = y, frame = z)) + 
    geom_bar(stat = "Identity") 
gg_animate(p) 

bars_animation

Nawiasem mówiąc, gdy próbuje tę samą działkę z geom_point wszystko działa zgodnie z oczekiwaniami.

q <- ggplot(df, aes(x = x, y = y, frame = z)) + 
    geom_point() 
gg_animate(q) 

Próbowałem opublikować kilka zdjęć, ale najwyraźniej nie mam wystarczającej reputacji, więc mam nadzieję, że bez nich będzie to miało sens. Czy to błąd, czy coś mi brakuje?

Dzięki z góry,

Thomas

Odpowiedz

10

Powodem jest to, że bez szlifowaniem, pręty są ułożone. Użyj position = "identity":

p <- ggplot(df, aes(x = x, y = y, frame = z)) + 
    geom_bar(stat = "Identity", position = "identity") 
gg_animate(p) 

enter image description here

w celu uniknięcia nieporozumień w takich sytuacjach, jest o wiele bardziej przydatne do zastąpienia frame przez fill (lub colour, w zależności od GEOM jesteś using`):

p <- ggplot(df, aes(x = x, y = y, fill = z)) + 
    geom_bar(stat = "Identity") 
p 

enter image description here

dwie działki, które zostaną narysowane po zastąpieniu fill przez frame wyłącznie odpowiadające wyłącznie rysowanie jednego z kolorów na raz.

+0

Dzięki, to ma sens! – tecb1234