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
Cependant, si je puis entrez ggplotly()
, j'obtiens le graphique ci-dessous:
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()
une idée de comment je peux afficher ceci correctement?
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 ( rep) 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))
Également dans plotly:
ggplotly()