In this video I show you how you can make nice interactive charts with the plot.ly package in R. I go over some issues I ran into regarding how plot.ly interacts with different date formats. Beneath the video you can find the code to reproduce it yourself and the necessary data here.
The video:
The code:
library(textclean)
library(plotly)
library(lubridate)
library(data.table)
library(datetime)
setwd("YOURWORKINGDIRECTORY")
#read in the data with fread from data.table
data <- data.table::fread("sunrise_vienna_2019_zamg.csv", encoding = "UTF-8")
#rename the columns
colnames(data) <- c("Day", "Month", "Year", "sunrise", "sunset", "moonrise", "moonset")
#use mgsub to rename the german months with numbers
data$Month <- textclean::mgsub(data$Month, unique(data$Month), seq(1:12))
#make a new column with the whole date, this uses data.table
data[, date := lubridate::dmy(paste(data$Day, data$Month, data$Year, sep="-"))]
#transform the time from character to a date-time format
data$sunrise <- as.POSIXct(data$sunrise, format = "%H:%M")
data$sunset <- as.POSIXct(data$sunset, format = "%H:%M")
# #lubridate doesn't work with the y-axis of plotly
# data$sunrise <- lubridate::hm(data$sunrise)
# data$sunset <- lubridate::hm(data$sunset)
#calculate the length of days and round them so they have no digits
data$day_length <- round(data$sunset - data$sunrise, 0)
#start preparing the plot
daylength_plot <- plot_ly(data = data, x = ~date, y = ~sunrise, mode = "lines", type = "scatter",
#we name the first line (sunrise) and edit the info for the mousover and change
#the color and "thickness" of the line
name = "Sunrise", line=list(width=5, color = "#ffca7c"),
#text that is shown on the mouseover
hoverinfo = "text", text = ~paste0("Date: ", date ,
"\n", "Sunrise: ", format(sunrise, "%H:%M") ,
"\n", "Sunset: ", format(sunset, "%H:%M"),
"\n", "Length of Day: ", day_length)
) %>%
#we add the second line (sunset), name it and set color and "thickness"
add_trace(y = ~sunset, mode = 'lines', name = "Sunset",
line=list(width=5, color = "#d4916e")
) %>%
#we add the length of the days as vertical lines
add_segments(x = ~date, xend = ~date, y = ~sunrise, yend = ~sunset, name = "Length of Day",
line=list(width=0.5, color = "#ffca7c")
) %>%
#we set some global options for the whole plot
layout(title = "Length of Days in Vienna 2019",
xaxis = list(title = "Date"),
yaxis = list(title = "Time of Day",
#we revers the y-axis so the mornings are on top
autorange = "reversed",
#we set the y-axis to date so it correctly maps the variable
type = "date",
#we also set the ticks so they correctly map the hours and minutes
tickformat="%H:%M")
)
#for publishing the plot on plot.ly we set our username and api key
# Sys.setenv("plotly_username"="YOURUSERNAME")
# Sys.setenv("plotly_api_key"="YOURAPIKEY")
#
# api_create(daylength_plot, filename = "daylength_vienna_2019", sharing = "public",
# fileopt = "overwrite")