GGanimate: geom_text с числовыми значениями анимирует десятичные числа вместо целых
Data <- data.frame(Time = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
Group = c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
Value = c(20, 10, 15, 20, 20, 20, 30, 25, 35))
У меня есть три группы со значениями в трех разных точках Time
,
library(ggplot2)
library(gganimate)
p <- ggplot(Data, aes(Group, Value)) +
geom_col(position = "identity") +
geom_text(aes(label = Value), vjust = -1) +
coord_cartesian(ylim = c(0, 40)) +
transition_time(Time)
p
Приведенный выше код довольно хорошо создает анимацию для преобразования столбцов, но изменение в geom_text оставляет желать лучшего, так как geom_text переворачивает / переходит с>10 десятичными разрядами. В идеале я хочу, чтобы числовые значения geom_text оставались целыми числами при переходе или каким-либо способом контролировать степень округления.
Изменить: Изменение Value
целочисленный тип не помогает.
1 ответ
Вы можете попытаться рассчитать переходы по своему усмотрению заранее...
library(gganimate)
library(tidyverse)
Data2 <- Data %>%
group_by(Group) %>%
arrange(Group) %>%
mutate(diff = c((Value - lag(Value))[-1],0))
Seq <- seq(1,3,0.01)
library(gganimate)
tibble(Time_new=rep(Seq,3), Group = rep(LETTERS[1:3], each = length(Seq))) %>%
mutate(Time=as.numeric(str_sub(as.character(Time_new),1,1))) %>%
left_join(Data2) %>%
group_by(Group, Time) %>%
mutate(diff = cumsum(diff/n())) %>%
mutate(Value2 = Value + diff) %>%
mutate(new_old = ifelse(Time == Time_new, 2, 1)) %>%
ggplot(aes(Group, Value2)) +
geom_col(position = "identity") +
geom_text(aes(label = sprintf("%1.2f",Value2)), vjust = -1) +
coord_cartesian(ylim = c(0, 40)) +
transition_manual(Time_new)
или попробуйте geom_text(aes(label = round(Value2,2)), vjust = -1)
Автор пакета предлагает очень элегантное общее решение:
..просто положи
"Year: {as.integer(frame_time)}"
как ваш титул
От сюда