如何在 Dygraphs 中缩放点?
How can I scale points in Dygraphs?
我正在为 R 使用很棒的 dygraphs 包 (https://rstudio.github.io/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, pointSize = 2)
p
我想按 james$drat
缩放 p 中点的大小,而不是将其固定为 2。
我该怎么做?
我认为 dygraphs javascript 库没有在每个系列中改变点大小的选项。一个非常简单的解决方法是为每个磅值创建一个系列。
假设我们想要 5 种不同的磅值,随着 james$drat
的变化而变化。首先,我们根据 drat
:
的值创建一个值为 1-5 的分箱变量
drat_binned <- cut(james$drat, breaks=5, labels=1:5)
然后我们创建绘图的 y 变量 (james$mpg
) 的 5 个副本:
james_new_variables <- matrix(rep(james$mpg, 5), nrow=nrow(james))
对于第 1 列,我们仅保留 mpg
值,其中 drat_binned
等于 1,相应地对于第 2-5 列。然后将变量添加到原始数据集中:
for (i in 1:5)
james_new_variables[drat_binned != i, i] <- NA
james <- data.frame(james, james_new_variables)
然后我们创建一个新的 dygraph
原始变量加上新变量(默认命名为 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
不是很优雅,但有点作品。唯一能揭示所用技巧的是图例,它被 X1-X5 标签弄乱了。
我知道这是一个老问题,但我使用 drawPointCallback
找到了一个潜在的解决方案。我希望它能帮助那里的人。如果您不想使用原始数字,可以在 R 或 JavaScript 中选择比例。
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)
)
)
我正在为 R 使用很棒的 dygraphs 包 (https://rstudio.github.io/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, pointSize = 2)
p
我想按 james$drat
缩放 p 中点的大小,而不是将其固定为 2。
我该怎么做?
我认为 dygraphs javascript 库没有在每个系列中改变点大小的选项。一个非常简单的解决方法是为每个磅值创建一个系列。
假设我们想要 5 种不同的磅值,随着 james$drat
的变化而变化。首先,我们根据 drat
:
drat_binned <- cut(james$drat, breaks=5, labels=1:5)
然后我们创建绘图的 y 变量 (james$mpg
) 的 5 个副本:
james_new_variables <- matrix(rep(james$mpg, 5), nrow=nrow(james))
对于第 1 列,我们仅保留 mpg
值,其中 drat_binned
等于 1,相应地对于第 2-5 列。然后将变量添加到原始数据集中:
for (i in 1:5)
james_new_variables[drat_binned != i, i] <- NA
james <- data.frame(james, james_new_variables)
然后我们创建一个新的 dygraph
原始变量加上新变量(默认命名为 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
不是很优雅,但有点作品。唯一能揭示所用技巧的是图例,它被 X1-X5 标签弄乱了。
我知道这是一个老问题,但我使用 drawPointCallback
找到了一个潜在的解决方案。我希望它能帮助那里的人。如果您不想使用原始数字,可以在 R 或 JavaScript 中选择比例。
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)
)
)