J'ai une simple trame de données:
seq <- 1:10
name <- c(paste0("company",1:10))
value <- c(250,125,50,40,40,30,20,20,10,10)
d <- data.frame(seq,name,value)
Et je veux le tracer de cette façon:
require(ggplot2)
ggplot(data = d,aes(x=seq,y=value))+geom_line() + geom_point()
Maintenant, je veux utiliser complotement, principalement pour pouvoir, lors du survol d'un point, obtenir d'autres informations que la valeur, telles que le nom de l'entreprise. J'essaye ceci:
require(plotly)
ggplotly()
ce qui me donne une info-bulle, mais avec seulement seq et valeur. J'ai essayé l'option tooltip = mais il est spécifié que vous pouvez utiliser la seule variable décrite dans l'esthétique, et je n'utilise pas le nom dans mes aes.
Toute solution? J'ai vu que je ne suis pas le premier avec ce problème, mais je n'ai pas trouvé de réponse avec ggplotly.
Vous n'avez pas besoin de modifier l'objet plotly
comme suggéré par @ royr2. Ajoutez simplement label = name
Comme troisième esthétique
ggplot(data = d, aes(x = seq, y = value, label = name)) + geom_line() + geom_point()
et l'info-bulle affichera name
en plus de seq
et value
.
Le fichier d'aide ggplotly
indique à propos du paramètre tooltip
:
La valeur par défaut, "tous", signifie afficher tous les mappages esthétiques (y compris l'esthétique "texte" non officielle).
Vous pouvez donc utiliser l'esthétique label
tant que vous ne voulez pas l'utiliser pour geom_text
.
BTW: J'ai également essayé text
au lieu de label
ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line() + geom_point()
mais alors ggplot2
s'est plaint
geom_path: Chaque groupe se compose d'une seule observation. Avez-vous besoin d'ajuster l'esthétique du groupe?
et tracé seulement des points. J'ai dû ajouter un groupe factice à geom_line
Pour supprimer le problème:
ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line(group = 1) + geom_point()
(Mais notez que si vous placez le groupe factice comme quatrième esthétique dans aes()
il apparaîtra par défaut également dans l'info-bulle.)
Cependant, je trouve que l'esthétique non officielle text
peut devenir utile aux côtés de label
si vous voulez avoir différentes chaînes tracées par geom_text
Et affichées dans l'info-bulle.
Modifier pour répondre à une question dans les commentaires: Le paramètre tooltip
à ggplotly()
peut être utilisé pour contrôler l'apparence. ggplotly(tooltip = NULL)
supprimera les info-bulles. ggplotly(tooltip = c("label"))
sélectionne l'esthétique à inclure dans l'info-bulle.
En s'appuyant sur la réponse de @ UweBlock, vous pouvez également créer une esthétique factice afin d'afficher plusieurs étiquettes dans les info-bulles. Je ne peux pas trouver où cela est documenté, mais je l'ai découvert emperiquement. Les variables factices apparaissent dans l'ordre dans lequel vous les spécifiez, mais la priorité est donnée aux variables par défaut (par exemple x et y). Pour contourner ce problème, vous pouvez spécifier ces variables dans une esthétique distincte, comme indiqué ci-dessous:
library(plotly)
p = ggplot(iris, aes(label=Species, label2=Petal.Length, label3=Petal.Width)) +
geom_point(aes(Sepal.Length,Sepal.Width))
ggplotly(p)
L'esthétique non officielle text
vous permet d'introduire toutes les variables que vous souhaitez (ici j'utilise name
deux fois pour le montrer):
require(ggplot2)
ggplot(data = d,aes(x = seq,
y = value,
group = 1,
text = paste('name: ', name,
'</br>name_again: ', name)
))+
geom_line() +
geom_point()
Je dois ajouter une esthétique factice group
pour le geom_line
pour fonctionner correctement comme l'a suggéré @UweBlock.
Enfin, je choisis ce que je veux afficher dans l'info-bulle (ici j'ai exclu group
).
require(plotly)
ggplotly(, tooltip = c("x", "y", "text"))
Vous devrez modifier le plotly object
Pour ce faire. Ou utilisez plot_ly()
pour créer le graphique à la place ...
EDIT: Avec la sortie de plotly 4.0
La syntaxe changera un peu.
seq <- 1:10
name <- c(paste0("company",1:10))
value <- c(250,125,50,40,40,30,20,20,10,10)
d <- data.frame(seq,name,value)
require(plotly)
gg <- ggplot(data = d,aes(x=seq,y=value))+geom_line() + geom_point()
gg <- plotly_build(gg)
#OLD:
gg$data[[1]]$text <- paste("Seq:", d$seq, "<br>",
"Value:", d$value, "<br>",
"Company:", d$name)
#UPDATED:
#Plotly_build creates two separate traces:
#One with mode = markers and the other with mode = lines
#Hence modify text for the second trace
gg$x$data[[2]]$text <- paste("Seq:", d$seq, "<br>",
"Value:", d$value, "<br>",
"Company:", d$name)
gg