Typically with finance time series, we plot with a Cartesian system like this.
require(rCharts)
require(PerformanceAnalytics)
#use the built in managers dataset from PerformanceAnalytics
data(managers)
chart.TimeSeries(
managers[,1],
main = "Returns with Cartesian Coordinates"
)
If we were to use rCharts
with d3js
, Cartesian still generally prevails as demonstrated by this simple dimplejs
plot of the same returns from above.
managers.df <- data.frame(
index(managers),
managers[,1]
)
colnames(managers.df) <- c( "date", "HAM1" )
managers.df$date <- format(managers.df$date, "%Y-%m-%d")
dP <- dPlot(
HAM1 ~ date,
data = managers.df,
type = "line",
height = 400,
width = 600
)
dP$xAxis(
type = "addTimeAxis",
inputFormat = "%Y-%m-%d",
outputFormat = "%b %Y"
)
dP$yAxis(
outputFormat = '.2%'
)
dP
However, we do have another option in Polar Coordinates. ggplot2
offers easy access to Polar Coordiantes with coord_polar
. Here is a simple example.
require(ggplot2)
autoplot(managers[,1]) + coord_polar() +
theme_bw() + theme( plot.title = element_text(size = rel(1.5))) +
labs( title = "Returns with Polar Coordinates" ) + xlab( NULL ) + ylab (NULL)
Until yesterday, getting an interactive d3js
version required an inordinate amount of work. Now we have micropolar
from Chris Viau. rCharts
author Ramnath Vaidyanathan quickly made micropolar
accessible as detailed here. Let's see how we can use it with our return data.
make_dataset = function(x, y, data = data){
require(rCharts)
lapply(toJSONArray2(data[c(x, y)], json = F, names = F), unlist)
}
retData <- data.frame(
# 0 to nrow scaled to 360 since 360 deg in circle
1:(NROW(managers)),#-1),# * 360/NROW(managers),
# make numeric javascript date
as.numeric(as.POSIXct(index(managers[,1])))*1000,
format(index(managers),"%b %Y"),
managers[,1],
stringsAsFactors=FALSE
)
colnames(retData) <- c('x','date','month','y')
#retData$jsdate=lapply(retData$date,function(x){return(paste0("#!new Date(",x,")!#"))})
retLine <- rCharts$new()
retLine$setLib(
'http://timelyportfolio.github.io/howitworks/libraries/widgets/micropolar'
)
retLine$set(
data = make_dataset( x = "x", y= "y", data = retData),
type = "linePlot",
originTheta = 0,
radialAxisTheta = 0,
angularDomain = #as.character(round(retData$x,2)),#retData$date[c(1,NROW(retData))],
paste0(
"#!d3.time.format('%b %Y')(new Date(",
retData$date[c(seq(1,NROW(retData),6),NROW(retData))],
"))!#"),
hideFirstTick = FALSE,
angularTicksSuffix = '',
tickOrientation = "horizontal",
minorTicks = 5,
flip = TRUE,
height = 400,
width = 400
)
retLine
Polar coordinates do have good and interesting use cases, but they are not always good as evidenced by the often maligned pie chart. Whether good or bad, I will leave to the reader. It is nice though to have the option.
Thanks Ramnath Vaidyanathan and Chris Viau.