使用R

时间:2019-11-13 05:27:41

标签: r ggplot2 gganimate

我有这种格式的数据:

head(data)
year    price   profit
2018    3185.96   9
2017    3249.69   10
2016    3005.24   6
2015    3739.79   17
2014    2238.22   15

我想获得价格变量为条形,利润为线,年份为x轴,并使用gganimate对图进行动画处理。我可以这样用2 y轴绘制两个变量的静态图:

p1 <- ggplot(data) + geom_bar(aes(year, price, fill = year), stat = 'identity') +
  geom_line(aes(year, profit*100)) +
  scale_y_continuous(name = 'Price',sec.axis = sec_axis(~./100, 'Profit%')) 

enter image description here 或以这种方式使用多面网格:

long <- pivot_longer(data, -year, names_to = 'Category', values_to = 'Value')

p2 <- ggplot(long, aes(year, Value)) + facet_grid(Category~., scales = 'free') +
  geom_bar(data = long[long$Category == 'price', ], stat = 'identity') +
  geom_line(data = long[long$Category == 'profit', ])

问题在于,我无法使用gganimate来动画任何一个图,因此在通过year变量时,过去的值/条会显示在图中。

如果我将transition_timetransition_statesshadow_mark一起使用,则无法绘制线条,而如果使用transition_reveal来绘制线条,则为过去几年酒吧正在逐渐消失。

enter image description here

在保留过去的值的同时,我需要使线和线都经过years

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找的是transition_manual()

library(tidyverse)
library(gganimate)

data %>%
  ggplot(aes(year, price, fill = year)) + 
  geom_bar(stat = 'identity') +
  geom_line(aes(year, profit*100)) +
  scale_y_continuous(name = 'Price',
                     sec.axis = sec_axis(~./100, 'Profit%')) + 
  transition_manual(year, cumulative = TRUE)

enter image description here