R 使用ggplotly时,如何选择要在工具提示中显示的变量?

R 使用ggplotly时,如何选择要在工具提示中显示的变量?,r,ggplot2,plotly,r-plotly,ggplotly,R,Ggplot2,Plotly,R Plotly,Ggplotly,我有一个简单的数据框: 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) 现在我想使用plotly,主要是为了能够在鼠标移动到某个点上时,获取除值以外的其他信息,例如公司名称。我试试这个: require(plotly) ggplotly() 这会给我一个工具提示,但只有seq

我有一个简单的数据框:

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)
现在我想使用plotly,主要是为了能够在鼠标移动到某个点上时,获取除值以外的其他信息,例如公司名称。我试试这个:

require(plotly)
ggplotly()
这会给我一个工具提示,但只有seq和value。我尝试了选项tooltip=,但它被指定了您可以使用美学中唯一的变量description,我在aes中不使用该名称


有解决办法吗?我发现我不是第一个遇到这个问题的人,但是我还没有找到解决ggplotly问题的答案。

要做到这一点,您必须修改
plotly对象。或者使用
plot\u ly()
来创建图形

编辑: 随着plotly 4.0的发布,语法将有一点变化

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

seq您不需要像@royr2所建议的那样,以绘图方式修改
对象。只需添加
label=name
作为第三个选项

ggplot(data = d, aes(x = seq, y = value, label = name)) + geom_line() + geom_point()
除显示
seq
value
外,工具提示还将显示
name

ggplotly
帮助文件显示了关于
工具提示的参数:

默认值“all”表示显示所有美学映射(包括非正式的“text”美学)

因此,您可以使用
标签
美观,只要您不想将其用于
几何图形文本

顺便说一句:我也尝试了
text
而不是
label

ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line() + geom_point()
但随后
ggplot2
抱怨

geom_路径:每组仅由一个观测值组成。您是否需要调整团队美学

只画点。我不得不在
geom_line
中添加一个虚拟组来消除这个问题:

ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line(group = 1) + geom_point()
(但请注意,如果将虚拟组作为第四个组放入
aes()
中,默认情况下它也会出现在工具提示中。)

但是,我发现,如果您希望通过
geom_text
绘制不同的字符串并在工具提示中显示,则非官方的
文本
美学与
标签
一起非常有用

编辑以回答评论中的问题:
ggplotly()
工具提示
参数可用于控制外观
ggplotly(tooltip=NULL)
将完全抑制工具提示
ggplotly(tooltip=c(“label”)
选择要包含在工具提示中的美学。

基于@UweBlock的答案,您还可以创建虚拟美学,以便在工具提示中显示多个标签。我找不到这是在哪里记录的,但发现它的经验。伪变量按您指定的顺序显示,但默认变量(如x和y)具有优先权。为了解决这个问题,您可以在单独的美学中指定这些变量,如下所示:

library(plotly)
p = ggplot(iris, aes(label=Species, label2=Petal.Length, label3=Petal.Width)) + 
  geom_point(aes(Sepal.Length,Sepal.Width))
ggplotly(p)

非官方的
文本
美学允许您介绍您想要的所有变量(这里我使用
名称
两次来显示它):


太好了,很有效谢谢!我也会给plot_ly()看一看,我想这可以提供更可读的代码,但这样我就不会被迫更新我所有的代码!这个解决方案在本地对我有效,但当我将应用程序放在闪亮的服务器上时,附加的工具提示就不存在了。然后我尝试了下面的解决方案,效果很好。@royr2仍然没有骰子-“公司”在中没有出现tooltip@CyrusMohammadian对我来说似乎没问题-我正在使用
plotly v4.0.1
@royr2有趣的是,我使用的是3.6.0版,我刚从CRAN重新安装了它,它仍然是同一版本,您是从github安装的吗?谢谢,在我看来,这是一种更具可读性的获得我想要的东西的方式。如果有人想使用geom_文本,那么aes应该直接放在geom_行和geom_文本中。除了添加其他标签外,是否还可以删除默认标签?@VisionDecision Yes。我已经相应地更新了我的答案。@UweBlock感谢您迄今为止的帮助。抱歉,我本应该更清楚一些,由于某种原因,我创建绘图的方式(可能是因为我使用的是shiny),如果我使用任何工具提示参数,似乎没有什么区别。所以我想知道在aes()函数中是否可以做些什么,比如如何使用label=、label2=等添加它们以删除默认标签。@JackH我为此挣扎了一段时间。记住在调用工具提示时使用美学名称,而不是变量名称。例如,使用
“x”
而不是
“seq”
“label”
而不是
“name”
。这确实有效。我有一个简单的问题,有没有办法订购工具提示?我的意思是x和y轴将位于第一位,然后是其他标签?@Joy它似乎想将x和y放在第一位,除非您将它们移动到geom_点的aes:
p=ggplot(iris,aes(label=Species,label2=Petal.Length,label3=Petal.Width))+geom_点(aes(Sepal.Length,Sepal.Width))
。结果图将按照工具提示在命令中的显示顺序显示工具提示。感谢您的回答,但我得到错误:参数3不是向量。有什么想法吗?不确定;我将这一行粘贴到R(版本3.2.5)中,得到了预期的绘图。我使用的是plotly版本3.4.13和ggplot2版本2.1.0。有关完整脚本,请参阅我的更新答案。这仍在R v4.0.3中运行。我真的希望我能对这篇文章投两次票,因为在aes()中引入“文本”真的解决了我的问题。非常感谢。
library(plotly)
p = ggplot(iris, aes(label=Species, label2=Petal.Length, label3=Petal.Width)) + 
  geom_point(aes(Sepal.Length,Sepal.Width))
ggplotly(p)
require(ggplot2)
ggplot(data = d,aes(x = seq, 
                    y = value,
                    group = 1,
                    text = paste('name: ', name,
                                 '</br>name_again: ', name)
                    ))+
  geom_line() + 
  geom_point()
require(plotly)
ggplotly(, tooltip = c("x", "y", "text"))