ggplotly n'affiche pas la ligne geom correctement

j'essaie d'utiliser ggplotly pour ajouter de l'interactivité à mon diagramme de ggplot. J'ai essayé d'exécuter ceci à la fois dans RStudio et depuis la ligne de commande, avec les mêmes résultats.

Données:

library(plotly)
df1 <- as.data.frame(list('x'=1:100,'y'=1:100,'lw'=abs(rnorm(100))))
b <- ggplot(data=df1, aes(x=x,y=y)) + geom_line(size=df1$lw)

Si je l'affichage b normalement, c'est à dire > b, j'obtiens une bonne intrigue enter image description here

Cependant, si je puis entrez ggplotly(), j'obtiens le graphique ci-dessous: enter image description here

en utilisant mes données réelles, les résultats sont égaux mauvais. Ci-dessous est un plot(), ce qui est correct, suivi par ggplotly() enter image description here

enter image description here

une idée de comment je peux afficher ceci correctement?

9
demandé sur Adam_G 2016-04-21 03:18:08

1 réponses

bien que ceci soit causé par un bug dans plotly (voir le commentaire de takje), vous pouvez contourner ce bug en traitant votre parcelle non pas comme une seule ligne avec plusieurs largeurs, mais comme autant de segments de ligne, chacun avec une largeur fixe.

tout d'Abord, configurez les données:

library(ggplot2)
library(plotly)
set.seed(123)
df1 <- as.data.frame(list('x'=1:100,'y'=1:100,'lw'=abs(rnorm(100))))

maintenant nous construisons une nouvelle base de données qui contient les points de début et de fin de chaque segment de ligne. I. e. n-ième segment de ligne va de (x_n,y_n) à (x_n+1, y_n+1). La répétition () dans le le code suivant est parce que les points intermédiaires forment le point final d'un segment, et aussi le point de départ du prochain. Les premier et dernier points de l'ensemble ne sont pas reprises car elles n'apparaissent que dans un seul segment de ligne:

x2 <- c(df1$x[1], rep(df1$x[2:(NROW(df1)-1)], each=2),  df1$x[NROW(df1)])
y2 <- c(df1$y[1], rep(df1$y[2:(NROW(df1)-1)], each=2),  df1$y[NROW(df1)])
df2 <- data.frame(x2,y2)

ensuite, nous étiquetons chacune des coordonnées x, et y avec une étiquette segnum, qui se réfère à quel segment de ligne ils sont:

df2$segnum <- rep(1:(NROW(df1)-1), each=2)

et un autre vecteur qui correspond à ces numéros de segment, et qui contient la largeur de ligne pour chaque segment:

df2$segw <- rep(df1$lw[1:(NROW(df1)-1)], each=2)

et de l'intrigue:

ggplot(data=df2, aes(x=x2,y=y2, colour=segnum)) + geom_line(aes(group = segnum, size=segw))

enter image description here

Également dans plotly:

ggplotly()

enter image description here

11
répondu dww 2016-04-26 23:47:44