如何在每个州重新排序动画条形图?
How to reorder an animate barplot at each state?
我目前正在使用 gganimate,但找不到正确排序条形图条的方法。我想按国家/地区表示平均值,按年份显示动画。我想我找到了怎么做(见下文),但我找不到每年如何订购(和重新订购)国家。下面我举个例子。
我试过 fct_reorder(),但我什至不能用正确的顺序得到一年。
我希望看到我的金条随着年份的变化而变化。
d <- tibble(country = as.factor(sample(c("France", "Germany", "UK"), 100, replace = TRUE)),
year = sample(c(2000, 2002, 2004, 2006), 100, replace = TRUE),
revenu = rnorm(100, mean = 1500, sd= 400))
d %>% group_by(country, year) %>%
summarise(avg_revenu = mean(revenu, na.rm = TRUE)) %>%
ggplot(aes(fct_reorder(country, avg_revenu), avg_revenu)) +
geom_bar(stat = "identity") +
coord_flip() +
transition_states(year, transition_length = 1, state_length = 1) +
ggtitle("{closest_state}")
我找到了这个页面: 但我承认我并不完全理解这个过程,我的 "mean" 问题让我头疼...
谁能帮我解决这个问题?谢谢!
因为我得到了自己的答案,所以我 post 把它放在这里,以防它能帮助到其他人。
1) 排名:思路是按国家和年份计算一个"average revenu",然后按每年avg_revenu计算国家的顺序
2) 图形:诀窍是不使用真正的条形图,而是使用 geom_tile。
#example constitution
d <- tibble(
country = as.factor(sample(
c("France", "Germany", "UK"), 100, replace = TRUE
)),
year = sample(c(2000, 2002, 2004, 2006), 100, replace = TRUE),
revenu = rnorm(100, mean = 1500, sd = 400)
)
#ranking
d2 <- d %>% group_by(country, year) %>% summarise(avg_revenu = mean(revenu, na.rm = TRUE)) %>% arrange(year, avg_revenu) %>% group_by(year) %>% mutate(order = min_rank(avg_revenu) * 1.0) %>% ungroup()
#animation object
anim <- d2 %>%
ggplot(aes(order, group = country)) +
geom_tile(aes(
y = avg_revenu / 2,
height = avg_revenu,
width = 0.9
), fill = "grey50") +
theme(axis.text.y = element_blank(), axis.title.y = element_blank()) +
scale_y_continuous(name = "Average revenu", breaks = c(0,500,1000,1500), limits = c(-500,NA)) +
transition_states(year, transition_length = 1, state_length = 3) +
geom_text(aes(y = 0, label = country), hjust = "right") +
coord_flip(clip = "off") +
ggtitle("{closest_state}")
#animation
animate(anim, nframes = 100)
我目前正在使用 gganimate,但找不到正确排序条形图条的方法。我想按国家/地区表示平均值,按年份显示动画。我想我找到了怎么做(见下文),但我找不到每年如何订购(和重新订购)国家。下面我举个例子。
我试过 fct_reorder(),但我什至不能用正确的顺序得到一年。
我希望看到我的金条随着年份的变化而变化。
d <- tibble(country = as.factor(sample(c("France", "Germany", "UK"), 100, replace = TRUE)),
year = sample(c(2000, 2002, 2004, 2006), 100, replace = TRUE),
revenu = rnorm(100, mean = 1500, sd= 400))
d %>% group_by(country, year) %>%
summarise(avg_revenu = mean(revenu, na.rm = TRUE)) %>%
ggplot(aes(fct_reorder(country, avg_revenu), avg_revenu)) +
geom_bar(stat = "identity") +
coord_flip() +
transition_states(year, transition_length = 1, state_length = 1) +
ggtitle("{closest_state}")
我找到了这个页面:
谁能帮我解决这个问题?谢谢!
因为我得到了自己的答案,所以我 post 把它放在这里,以防它能帮助到其他人。
1) 排名:思路是按国家和年份计算一个"average revenu",然后按每年avg_revenu计算国家的顺序
2) 图形:诀窍是不使用真正的条形图,而是使用 geom_tile。
#example constitution
d <- tibble(
country = as.factor(sample(
c("France", "Germany", "UK"), 100, replace = TRUE
)),
year = sample(c(2000, 2002, 2004, 2006), 100, replace = TRUE),
revenu = rnorm(100, mean = 1500, sd = 400)
)
#ranking
d2 <- d %>% group_by(country, year) %>% summarise(avg_revenu = mean(revenu, na.rm = TRUE)) %>% arrange(year, avg_revenu) %>% group_by(year) %>% mutate(order = min_rank(avg_revenu) * 1.0) %>% ungroup()
#animation object
anim <- d2 %>%
ggplot(aes(order, group = country)) +
geom_tile(aes(
y = avg_revenu / 2,
height = avg_revenu,
width = 0.9
), fill = "grey50") +
theme(axis.text.y = element_blank(), axis.title.y = element_blank()) +
scale_y_continuous(name = "Average revenu", breaks = c(0,500,1000,1500), limits = c(-500,NA)) +
transition_states(year, transition_length = 1, state_length = 3) +
geom_text(aes(y = 0, label = country), hjust = "right") +
coord_flip(clip = "off") +
ggtitle("{closest_state}")
#animation
animate(anim, nframes = 100)