web-dev-qa-db-fra.com

Comment choisir la variable à afficher dans l'infobulle lors de l'utilisation de ggplotly?

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.

29
Malta

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.

45
Uwe

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)

enter image description here

30
teadotjay

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"))
13
DAVL

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
11
royr2