How can I scale points in Dygraphs?
I am using the great dygraphs package for R (https://rstudio.github.io/dygraphs/)
My code as of right now is:
james<-mtcars[c("mpg","drat")]
james$date<-seq(from=as.Date("2013-05-16"),to=as.Date("2013-06-16"),by="days")
x <- xts::xts(james$mpg, order.by = james$date)
p <- dygraphs::dygraph(x, main = "mpg over time", xlab = "Date", ylab = "mpg") %>%
dygraphs::dyRangeSelector() %>%
dyOptions(drawPoints = TRUE, pointSize = 2)
p
I want to scale the size of points in p by james$drat
, rather than having it fixed at 2.
How can I do this?
I think the dygraphs javascript library has no option for varying point size within each series. A quite simple workaround is to create one series for every point size.
Let us say we want 5 different point sizes, varying with james$drat
. First, we create a binned variable with values 1-5 depending on the value of drat
:
drat_binned <- cut(james$drat, breaks=5, labels=1:5)
Then we create 5 copies of the plot's y variable ( james$mpg
):
james_new_variables <- matrix(rep(james$mpg, 5), nrow=nrow(james))
For column number 1 we keep only the mpg
values where drat_binned
equals 1, and correspondingly for columns number 2-5. The variables are then added to the original data set:
for (i in 1:5)
james_new_variables[drat_binned != i, i] <- NA
james <- data.frame(james, james_new_variables)
Then we make a new dygraph
of the original variable plus the new variables (by default named X1-X5
):
x <- xts::xts(james[,c("mpg","X1","X2","X3","X4","X5")], order.by = james$date)
p <- dygraphs::dygraph(x, main = "mpg over time", xlab = "Date", ylab = "mpg") %>%
dygraphs::dyRangeSelector() %>%
dySeries("mpg") %>%
dySeries("X1", color="blue", drawPoints = TRUE, pointSize = 2) %>%
dySeries("X2", color="blue", drawPoints = TRUE, pointSize = 3) %>%
dySeries("X3", color="blue", drawPoints = TRUE, pointSize = 4) %>%
dySeries("X4", color="blue", drawPoints = TRUE, pointSize = 5) %>%
dySeries("X5", color="blue", drawPoints = TRUE, pointSize = 6) %>%
p
Not very elegant, but sort of works. The only thing that reveals the trick used is the legend, which becomes messed up with the X1-X5 labels.
I know this is an old question, but I have found a potential solution using drawPointCallback
. I hope it helps someone out there. You could choose a scale either in R or JavaScript if you did not want to use the raw number.
library(dygraphs)
james<-mtcars[c("mpg","drat")]
james$date<-seq(from=as.Date("2013-05-16"),to=as.Date("2013-06-16"),by="days")
x <- xts::xts(james$mpg, order.by = james$date)
p <- dygraphs::dygraph(x, main = "mpg over time", xlab = "Date", ylab = "mpg") %>%
dygraphs::dyRangeSelector() %>%
dyOptions(drawPoints = TRUE)
p %>%
dyCallbacks("drawPointCallback" = sprintf(
"
function(g, name, ctx, canvasx, canvasy, color, radius, index) {
var drat = %s;
radius = drat[index];
return Dygraph.Circles.DEFAULT(g, name, ctx, canvasx, canvasy, color, radius)
}
",
jsonlite::toJSON(mtcars$drat)
)
)
链接地址: http://www.djcxy.com/p/86584.html
上一篇: 在Java问题中蛮力数独求解算法
下一篇: 如何在Dygraphs中缩放点?