2015-01-19 2 views
2

Я пытаюсь анимировать сложную линейную диаграмму в ggplot2.Анимация ggplot2 сложенная линейная диаграмма в R

Вот сюжет я хотел бы анимировать: enter image description here

Вот код, чтобы создать подобный сюжет:

#Data 
mydata <- data.frame(year=rep(1:6, times=4), 
       activity=as.factor(rep(c("research","coursework","clinical work","teaching"), each=6)), 
       time=c(40, 35, 40, 60, 85, 90, 
         50, 40, 10, 0, 5, 0, 
         5, 20, 20, 40, 10, 10, 
         5, 5, 30, 0, 0, 0)) 

mydata$activity <- ordered(mydata$activity, levels = c("research","clinical work","coursework","teaching")) 

labels <- data.frame(activity=c("research","coursework","clinical work","teaching"), 
       xaxis=c(5, 1.8, 2.5, 2.97), 
       yaxis=c(25, 70, 48, 90)) 

#Plot 
ggplot(mydata, aes(x=year, y=time, fill=activity)) + 
    geom_area(stat="smooth", span=.35, color="black") + 
    theme(legend.position = "none") + 
    geom_text(data=labels, aes(x=xaxis, y=yaxis, label=activity)) + 
    ggtitle("Time in Different Activities by Year in Program") + 
    ylab("Percentage of Time") + 
    xlab("Year in Program") 

Я ищу для первого изображения для отображения всех осей и текста , Вторая итерация, я хотел бы постепенно раскрывать с течением времени, слева направо, линию исследований «Исследование» (включая цвет и границу). Третья итерация, я хотел бы постепенно раскрыть слева направо линию «Клиническая работа». В-четвертых, линия «Курсовая работа». И, наконец, «Обучающая» сложная линия.

В идеале формат вывода будет очень плавным (без зубчатых переходов) и будет совместим с PowerPoint.

ответ

1

Извините за то, что вы внедрили не-программное решение, но я просто создавал графики для каждой итерации отдельно, помещал их в точку питания (один график на одном слайде) и использовал некоторые причудливые эффекты перехода слайдов (я пробовал случайный Эффекты баров на вашем примере, и это выглядело хорошо).

Если вы решили найти решение на основе R, вы можете взглянуть на пакет animate (см. Пример моделирования стратегического зомби here).

+0

Это возможность. Я не уверен, как построить отдельную итерацию. Как бы я построил каждую итерацию отдельно? Т.е., как бы я построил 1) только диаграмму «Исследование», затем 2) как линейные диаграммы «Исследования», так и «Клиническая работа», а затем 3) «Исследования», «Клиническая работа» и «Курсовая работа», линейные диаграммы? – dadrivr

+0

Вы можете попытаться построить на соответствующих подмножествах данных, которые могут быть получены, например. 'subset (mydata, activity% in% c ('research', 'coursework'))' –

+1

Это работало с использованием перехода «стереть» в powerpoint (протирание слева направо). Благодаря! – dadrivr

3

Адрес: R-based solution. Он сохраняет отдельные цифры (.png), которые можно повторить в рамках презентации.

В качестве альтернативы, вы можете создать анимацию (например, преобразовывая в .gif) с помощью ImageMagick http://www.imagemagick.org/

#Data 
mydata <- data.frame(year=rep(1:6, times=4), 
        activity=as.factor(rep(c("research","coursework","clinical work","teaching"), each=6)), 
        time=c(40, 35, 40, 60, 85, 90, 
          50, 40, 10, 0, 5, 0, 
          5, 20, 20, 40, 10, 10, 
          5, 5, 30, 0, 0, 0)) 

#order the activities and then the dataframe 
mydata$activity <- ordered(mydata$activity, levels = c("research","clinical work","coursework","teaching")) 
mydata <- mydata[order(mydata$activity),] 

#labels 
labels <- data.frame(activity=c("research","coursework","clinical work","teaching"), 
        xaxis=c(5, 1.8, 2.5, 2.97), 
        yaxis=c(25, 70, 48, 90)) 

#creates a function to draws a plot for each activity 
draw.stacks<-function(leg){ 
    int <- leg*6 
    a<-ggplot(data=mydata[1:int,], aes(x=year, y=time, fill=activity))+ 
    geom_area(stat="smooth", span=.35, color="black") + 
    theme_bw()+ 
    scale_fill_discrete(limits = c("research","clinical work","coursework","teaching"), guide="none")+ 
    theme(panel.grid.major = element_blank(), 
      panel.grid.minor = element_blank()) + 
    coord_cartesian(xlim=c(1,6),ylim=c(0,100))+ 
    geom_text(data=labels, aes(x=xaxis, y=yaxis, label=activity)) + 
    ggtitle("Time in Different Activities by Year in Program") + 
    ylab("Percentage of Time") + 
    xlab("Year in Program") 
    print(a) 
} 


# save individual png figures 
for (i in 0:4) { 
png(paste("activity", i, "png", sep=".")) 
    draw.stacks(i) 
dev.off() 
}