To produce interactive visualization, we need to install rCharts.

require(devtools)
install_github('rCharts', 'ramnathv')

Let’s fire up necessary libraries.

library(ggplot2)
library(lubridate)
library(scales)
library(rCharts)

Load Facebook page data.

posts <- read.csv("dt_posts.csv", header = TRUE)
#return posts that contain a given keyword
#posts <- posts[grep("job", posts$message), ]

Convert the timestamps of the posts. Sort posts from oldest to latest

posts$created_time <- ymd_hms(posts$created_time)
posts$created_time <- with_tz(posts$created_time, "America/New_York")
posts <- posts[order(posts$created_time, decreasing = FALSE),]
posts$created_date <- as.Date(posts$created_time)

Count posts, likes, shares, comments,love, haha, wow, sad and angry

#daily count
posts$post_basecount <- 1
posts$post_perday <-ave(posts$post_basecount,posts$created_date,FUN=sum)
posts$like_perday <-ave(posts$likes_count,posts$created_date,FUN=sum)
posts$share_perday <-ave(posts$shares_count,posts$created_date,FUN=sum)
posts$comment_perday<-ave(posts$comments_count,posts$created_date,FUN=sum)
posts$love_perday<-ave(posts$love_count,posts$created_date,FUN=sum)
posts$haha_perday<-ave(posts$haha_count,posts$created_date,FUN=sum)
posts$wow_perday<-ave(posts$wow_count,posts$created_date,FUN=sum)
posts$sad_perday<-ave(posts$sad_count,posts$created_date,FUN=sum)
posts$angry_perday<-ave(posts$angry_count,posts$created_date,FUN=sum)

#average count
posts$like_avg <-as.integer(ave(posts$likes_count,posts$created_date,FUN=mean))
posts$share_avg <-as.integer(ave(posts$shares_count,posts$created_date,FUN=mean))
posts$comment_avg<-as.integer(ave(posts$comments_count,posts$created_date,FUN=mean))
posts$love_avg<-as.integer(ave(posts$love_count,posts$created_date,FUN=mean))
posts$haha_avg<-as.integer(ave(posts$haha_count,posts$created_date,FUN=mean))
posts$wow_avg<-as.integer(ave(posts$wow_count,posts$created_date,FUN=mean))
posts$sad_avg<-as.integer(ave(posts$sad_count,posts$created_date,FUN=mean))
posts$angry_avg<-as.integer(ave(posts$angry_count,posts$created_date,FUN=mean))

#create a new data frame for the engagement metrics 
engagement<- posts[!duplicated(posts$created_date),c("created_date","post_perday","like_perday", "share_perday", "comment_perday", "love_perday", "haha_perday", "wow_perday","sad_perday", "angry_perday", "like_avg", "share_avg", "comment_avg", "love_avg", "haha_avg","wow_avg", "sad_avg", "angry_avg")]

engagement[is.na(engagement)] <- 0

#cumulative count
engagement$post_cumsum <- ave(engagement$post_perday, FUN = cumsum)
engagement$like_cumsum <- ave(engagement$like_perday, FUN = cumsum)
engagement$share_cumsum <- ave(engagement$share_perday, FUN = cumsum)
engagement$comment_cumsum <- ave(engagement$comment_perday, FUN = cumsum)
engagement$love_cumsum <- ave(engagement$love_perday, FUN = cumsum)
engagement$haha_cumsum <- ave(engagement$haha_perday, FUN = cumsum)
engagement$wow_cumsum <- ave(engagement$wow_perday, FUN = cumsum)
engagement$sad_cumsum <- ave(engagement$sad_perday, FUN = cumsum)
engagement$angry_cumsum <- ave(engagement$angry_perday, FUN = cumsum)

Create a daily count plot for one of the engagement metrics

ggplot(data = engagement, aes(x = created_date, y = share_avg)) +
  geom_line(size = 1.1, alpha = 0.7, aes(color = share_avg)) +
  geom_point(size = 0.5) +
  ylim(0, NA) +
  theme(legend.title=element_blank(), axis.title.x = element_blank())+
  ylab("average # of shares per day") + 
  ggtitle("Average share volume per day")

Create a cumulative count plot for one of the metrics

ggplot(data = engagement, aes(x = created_date, y = like_cumsum))+
  geom_line(size = 1.1, alpha = 0.7, aes(color = like_cumsum)) +
  geom_point(size = 0.5) +
  ylim(0, NA) +
  theme(legend.title=element_blank(), axis.title.x = element_blank())+
  ylab("Cumulative count of likes") + 
  ggtitle("Cumulative growth of likes")

Plot Facebook reactions daily count.

ggplot(data = engagement, aes(created_date)) + 
  geom_line(aes(y = love_perday, colour = "love")) + 
  geom_line(aes(y = haha_perday, colour = "haha"))+
  geom_line(aes(y = wow_perday, colour = "wow"))+
  geom_line(aes(y = sad_perday, colour = "sad"))+
  geom_line(aes(y = angry_perday, colour = "angry"))+
  xlab("Date")+
  ylab("Daily count of Facebook reactions") + 
  ggtitle("Daily count of Facebook reactions")

Plot Facebook reaction cumulative count.

ggplot(data = engagement, aes(created_date)) + 
  geom_line(aes(y = love_cumsum, colour = "love")) + 
  geom_line(aes(y = haha_cumsum, colour = "haha"))+
  geom_line(aes(y = wow_cumsum, colour = "wow"))+
  geom_line(aes(y = sad_cumsum, colour = "sad"))+
  geom_line(aes(y = angry_cumsum, colour = "angry"))+
  xlab("Date")+
  ylab("Cumulative count of Facebook reactions") + 
  ggtitle("Cumulative growth of Facebook reactions")

Let’s make an interactive chart for Facebook reactions

#require(rCharts)
#require(reshape2)
#library(knitr)
#options(rpubs.upload.method = "internal")
#opts_chunk$set(comment = NA, results = "asis", tidy = F)  
engagement$date_show <-as.Date(engagement$created_date,format="%Y-%m-%d")
engagement$date_show <- as.character(engagement$date_show)

m1 <- mPlot(x = 'date_show', y = c("love_perday","haha_perday","wow_perday","sad_perday","angry_perday"), type = 'Line',data = engagement)
m1$set(pointSize = 0, lineWidth = 1)
m1$print('chart2', include_assets = TRUE)
Loading required package: reshape2