記錄數據可視化的每一個瞬間

2017-05-18 杜雨 EasyCharts

之前寫過兩篇關於使用animation包來製作時間維度動態可視化GIF圖,效果還是很棒的,最近又發現了一個好玩的包——gganimate,它也是主打製作時間維度動態可視化的,不過該包將動態展示的技術通過一個參數封裝到了aes()函數裡面,這就意味著我們省去了寫繁瑣的循環,直接可以通過ggplot函數一步搞定複雜的動態圖表製作。

但是方便 至於必然存在缺陷,由於該包給我們的自由調整空間太小,我甚至無法調整輸出圖表的質量、尺寸,導致最終的成圖看起來非常的怪異,無奈每一個案例效果我都用animation包又從新實現了一次,這樣大家就可以看到對比效果了。

library(ggplot2)

library(maps)

library(plyr)

library(grid)

library(RColorBrewer)

library("dplyr")

library(gapminder)

library(gganimate)

library(animation)

此次使用的地圖是maps中的世界地圖,因為原始數據是gapminder包(沒錯就是那個做動態可視化很吊的團隊,他們有個網站就叫gapminder,裡面各種高大上動態圖,而且還提供了動態圖演示的桌面端軟體)提供的數據。因為國家名稱有出入,我自己又整理了一份對照表。

world_map<-map_data("world")

world_map[world_map$group==1425&world_map$group==1425,"region"]<-"Trinidad and Tobago"

setwd("D:/")

Country<-read.csv("mydata.csv",stringsAsFactors = FALSE,check.names = FALSE)

mapdata<-left_join(gapminder,Country)%>%na.omit()

mapdata$fan<-cut(mapdata$gdpPercap,breaks=c(min(mapdata$gdpPercap),2500,5000,7500,10000,15000,20000,30000,40000,max(mapdata$gdpPercap)),

labels=c("<=2500","2500~5000","5000~7500","7500~10000","10000~1500","1500~20000","20000~30000","30000~40000"," >=40000"),include.lowest=TRUE,order=TRUE)

mapnew_data<-left_join(world_map[,-6],mapdata[,-1],by="region")

使用colorbrewer提供的色盤:

color1<-brewer.pal(9,"YlOrRd")[c(3,4,5,6,7,8,9)]

color2<-brewer.pal(9,"Greens")[c(4,6)]

color<-c(rev(color2),color1)

定製一款主題:

mytheme<-theme(

panel.grid = element_blank(),

panel.background = element_blank(),

axis.text = element_blank(),

axis.ticks = element_blank(),

axis.title = element_blank(),

legend.position ="none",

plot.background=element_rect(I(0),linetype=0)

)

分段填色熱力圖:(gganimate版)

p1<-ggplot(data=mapnew_data,aes(x=long,y=lat,group=group,fill=fan,frame=year))+

geom_polygon(colour="grey",size=.2)+

guides(fill=guide_legend(reverse=TRUE))+

scale_fill_manual(values=color,na.value="grey95")+

mytheme

gganimate(p1,interval = .5,"output.gif")

(動圖,請點開查看)

分段填色(animation版)

year<-unique(gapminder$year)

saveGIF({

for (i in year) {

title <- as.character(i)

g1<-ggplot()+

geom_polygon(data=world_map,aes(x=long,y=lat,group=group),fill="white",colour="grey",size=.2)+

geom_polygon(data=filter(mapnew_data,year==i),aes(x=long,y=lat,group=group,fill=fan),colour="grey",size=.2)+

guides(fill=guide_legend(reverse=TRUE))+

scale_fill_manual(values=color,na.value="grey95")+

mytheme

print(g1)

}

},movie.name=world_population_Area.gif,interval=0.2,ani.width_=1200,ani.height=750)

(動圖2,請點開查看)

製作散點坐標數據:

midpos <- function(AD1){mean(range(AD1,na.rm=TRUE))}

centres <- ddply(mapnew_data,.(region),colwise(midpos,.(long,lat)))

pointdata<-left_join(mapdata[,c(3,5,7)],centres)

帶填色散點圖(gganimate版)

p2<-ggplot(data=pointdata,aes(x=long,y=lat,frame=year))+

geom_polygon(data=mapnew_data,aes(x=long,y=lat,group=group),colour="grey",size=.2,fill="white")+

geom_point(aes(size=pop,fill=pop),shape=21,colour="black")+

scale_fill_gradient(low="white",high="#D73434")+

scale_size_area(max_size=18)+

mytheme

gganimate(p2,interval = .5,"output2.gif")

(動圖,請點開查看)

帶填色散點圖(animation版)

year<-unique(gapminder$year)

saveGIF({

for (i in year) {

title <- as.character(i) g1<-ggplot()+

geom_polygon(data=world_map,aes(x=long,y=lat,group=group),colour="grey",size=.2,fill="white")+

geom_point(data=filter(pointdata,year==i),aes(x=long,y=lat,size=pop,fill=pop),shape=21,colour="black")+

scale_fill_gradient(low="white",high="#D73434")+

labs(title=paste0("Population structure of World:",title),caption="Data Source:GapMinder") +

scale_size_area(max_size=18)+

guides(fill=guide_legend(reverse=TRUE))+

mytheme

print(g1)

}

},movie.name=world_population.gif,interval=0.2,ani.width_=1200,ani.height=750)

(動圖,請點開查看)

雖然說gganimate包製作的動態圖效果不是很好調整,但是它整合了一些非常棒的功能,大大簡化了動態圖製作,他也可以製作累計動態圖(隨著年份增加,在保留過去效果的基礎上,增加最新事件內的效果),他不僅可以將時間變數作為切換維度,甚至不限制維度變數性質,即分類資料也是可以支持切換。

案例在ggplot2的擴展包社區里,你也可以在它的GitHub主頁上找到相關介紹:

歡迎關注魔方學院QQ群

EasyCharts團隊出品

帥的人都關注了EasyCharts團隊^..^~

QQ交流群:553270834

微信公眾號:EasyCharts

更多信息敬請查看: easychart.github.io/pos


推薦閱讀:

快訊| 2017年6月份精選R包
數據地圖多圖層對象的顏色標度重疊問題解決方案
數據分析領域裡,R和Python到底哪個市場需求大?
數據分析學習階段小結
我為什麼要在Excel和R之間徘徊——數據分析者的基本修養

TAG:R编程语言 | ggplot |