2017-03-29 8 views
7

Próbuję animować niektóre dane miesięczne za pomocą gganimate. Wykresy działają znakomicie, z tym wyjątkiem, że obecność znaków dolnych (liter, które wykraczają poniżej linii bazowej, tj. G, j, p, q i y) zmienia ilość miejsca zajmowanego przez tytuł. To z kolei przesuwa nieco linię bazową tytułu, co odciąża animację. Oznacza to, że tytuł wyraźnie "podskakuje" trochę, gdy w tytule jest podstęp.Zapobieganie zmianie przestrzeni tytułowej podczas animowania za pomocą liter zstępujących

Przykład:

myDF <- 
    data.frame(
    Date = seq(as.Date("2015-01-15") 
       , as.Date("2015-12-15") 
       , "1 month") 
    , x = 1:12 
    , y = 1:12 
) 

myDF$frame <- 
    factor(format(myDF$Date, "%Y-%b") 
     , levels = paste0("2015-", month.abb)) 

toAnimate <- 
    ggplot(
    myDF 
    , aes(x = x 
      , y = y 
      , frame = frame) 
) + 
    geom_point() + 
    theme_gray() 

gganimate::gganimate(toAnimate) 

enter image description here

Korzystanie ze starszej wersji gganimate problem był bardziej oczywiste (i nie wymagają włączenia roku do wykazania), gdyż przeniósł fabuły zamiast o tytule:

gganimate::gg_animate(toAnimate) 

enter image description here

Mogę "naprawić" problem za pomocą wszystkich ograniczeń (które nie ma żadnych podcięć), ale nie podoba mi się wygląd wszystkich limitów (szczególnie jako część większych tytułów dla rzeczywistego przypadku użycia). Mogę również dodać tytuł ramki do czegoś, co już ma podrzędność, np. ggtitle("Timeperiod: ") chociaż wolałbym nie dodawać nieistotnego tekstu tylko po to, by obejść ten problem (dodając "Timeperiod:" jest to, na co teraz poszedłem).

Przeglądam pomoc na temat theme w ggplot2, ale nie widzę niczego, co wygląda na to, aby rozwiązać ten problem.

+0

Czy próbowałeś aktualizacji * gganimate *? Najnowsza wersja zastąpiła funkcję 'gg_animate' z' gganimate'. Nie mogę odtworzyć problemu z descender z nowszą wersją. – aosmith

+0

Dzięki @Aosmith. Właśnie zaktualizowałem, a problem jest teraz znacznie bardziej subtelny (do punktu, w którym potencjalnie nie jest to problemem). Aktualizacja wydaje się jednak powodować przesunięcie linii bazowej tytułu (która jest lepsza niż zmiana obszaru wykresu, ale nadal nie jest idealna). Kwestia ta jest mniej subtelna, gdy w tytule występuje ślad do miesiąca, więc skorygowałem nieco fabułę (wliczając rok), aby było łatwiej zobaczyć. –

Odpowiedz

2

Wygląda na to, że tytuł zawiera tylko wysokość tekstu, a nie wysokość czcionki, przy rezerwowaniu miejsca na tytuł.

Dzięki temu można zamiast tego użyć tytułu geom_text, aby umieścić tytuł w miejscu wydruku. Na przykład, jeśli mam zrobić:

ggplot(myDF, aes(x=x,y=y, label=frame)) + 
    geom_point()+theme_gray() + 
    geom_text(x=2.5,y=5,aes(label=frame),adj=0) 

(tak jak ggplot, jeszcze nie animowanego ...) widzę cały 2015 jest dokładnie się pokrywają, a zjazdowe z nazwami miesięcy są wyraźnie tam, a tekst linia podstawowa jest stała.

Więc jeśli umieścisz tytuł w poręcznej przestrzeni na działce, możesz użyć tego i użyć title_frame=FALSE w swoim gganimate.

Rozważę również zgłoszenie błędu/ulepszenia do ggplot2. Jeśli się tytuł na tyle duża, że ​​faktycznie tupie na działce:

ggplot(myDF, aes(x=x,y=y)) +geom_point()+theme(plot.title=element_text(size=rel(10),debug=TRUE)) + labs(title="y") 

enter image description here

+0

Jest to solidne obejście i świetna pomoc. W praktyce fabuła, którą tworzę jest wystarczająco skomplikowana (aspekty, czynniki, itp.), Że użycie "geom_text" jako obejścia tytułowego jest mniej niż idealne.Bardzo interesujące jest to, że "błąd" (?) Może leżeć w zarządzaniu rezerwacją przestrzeni przez ggplot2. Jednak nie jestem pewien, czy ten przypadek użycia wystarczy, aby uzasadnić reorganizację tego. Wznowieni, ale zamierzam odejść jako niedopuszczony na krótko, aby sprawdzić, czy pojawia się odpowiedź, która rozwiązuje ten problem (wątpię w to, jak sądzę, twoje wyjaśnienie to wyklucza). –

+1

Jeśli był jakiś sposób dodania niewidocznego "y" do tytułu, to mogłoby zadziałać ... Nie widziałem żadnej opcji "element_text", aby naprawić wysokość. – Spacedman