2015-07-08 14 views
7

Sto usando il pacchetto di grandi dygraphs per R (https://rstudio.github.io/dygraphs/)Come posso ridimensionare i punti in Dygraphs?

Il mio codice che fin da oggi è:

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 

voglio scalare la dimensione dei punti in p da james$drat, piuttosto che averlo riparato a 2.

Come posso fare questo?

risposta

1

Penso che la libreria javascript di dygraphs non abbia opzioni per la variazione delle dimensioni dei punti all'interno di ogni serie. Una soluzione abbastanza semplice è creare una serie per ogni dimensione in punti.
Supponiamo di volere 5 punti di dimensioni diverse, variando con james$drat. In primo luogo, creiamo una variabile categorizzata con valori 1-5 a seconda del valore di drat:

drat_binned <- cut(james$drat, breaks=5, labels=1:5) 

viene creato 5 copie della variabile y del plot (james$mpg):

james_new_variables <- matrix(rep(james$mpg, 5), nrow=nrow(james)) 

Per numero di colonna 1 manteniamo solo i valori mpg dove drat_binned è uguale a 1 e corrispondentemente per le colonne numero 2-5. Le variabili sono poi aggiunti al set di dati originale:

for (i in 1:5) 
    james_new_variables[drat_binned != i, i] <- NA 
james <- data.frame(james, james_new_variables) 

Poi facciamo una nuova dygraph della variabile originale più le nuove variabili (di default denominato 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 

Non molto elegante, ma una specie di opere. L'unica cosa che rivela il trucco utilizzato è la leggenda, che diventa incasinata con le etichette X1-X5.

3

So che questa è una vecchia domanda, ma ho trovato una soluzione potenziale utilizzando drawPointCallback. Spero che aiuti qualcuno là fuori. È possibile scegliere una scala in R o JavaScript se non si desidera utilizzare il numero grezzo.

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) 
    ) 
) 
Problemi correlati