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

58

我有一个简单的数据框:

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(ggplot2)
ggplot(data = d,aes(x=seq,y=value))+geom_line() + geom_point()

现在我想使用plotly,主要是为了能够在鼠标悬停在某个点时获取除该值外的其他信息,例如公司名称。我尝试了这个:

require(plotly)
ggplotly()

我想要一个提示框,但只显示序列和值。我尝试了选项tooltip=,但它指定只能使用美学中描述的变量,并且我没有在我的美学中使用变量名称。

有什么解决方法吗?我看到我不是第一个遇到这个问题的人,但我没有找到适用于ggplotly的答案。

4个回答

82

您无需像@royr2建议的那样修改plotly对象,只需将label=name作为第三个美学元素添加即可。

ggplot(data = d, aes(x = seq, y = value, label = name)) + geom_line() + geom_point()

并且工具提示将显示name以及seqvalue

ggplotly的帮助文件关于tooltip参数说:

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

因此,只要您不想将其用于geom_text,就可以使用label美学。

顺便说一下:我还尝试过将label替换为text

ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line() + geom_point()

但是ggplot2报错了:

geom_path:每个组仅由一个观测值组成。您需要调整组的美学吗?

于是它只绘制出了点。我不得不向geom_line添加一个虚拟分组来解决这个问题:

ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line(group = 1) + geom_point()

请注意,如果在aes()中将虚拟组作为第四个美学,则它将默认出现在工具提示中。

然而,我发现非官方的text美学可以与label一起使用,如果您想要用geom_text绘制不同的字符串并在工具提示中显示。

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


谢谢,这对我来说似乎是一种更易读的方式来获得我想要的内容。如果有人想使用geom_text,则应该直接将aes放在geom_line和geom_text中。 - Malta
1
除了添加其他标签外,是否还可以删除默认标签? - Jack H
@VisionIncision 是的。我已经相应地更新了我的答案。 - Uwe
@UweBlock 感谢您迄今为止的帮助。抱歉,我应该表述得更清楚。由于我正在使用shiny创建绘图(可能是因为这个原因),似乎无论我使用任何工具提示参数都没有什么区别。因此,我想知道是否可以在aes()函数中做些什么,就像您可以通过label=、label2=等添加它们以删除默认标签一样。 - Jack H
1
我发现如果你使用 label = name,那么工具提示信息将显示为 name: companyX,而如果你使用 text = name,则工具提示只会显示 companyX。这对我很有用,因为我已经在自己的列中创建了工具提示信息,使用了 str_c('Line 1: ', line1_col, '<br> Line 2: ', line2_col', ...),当使用 label = 时,它令人恼火地在标签开头包含了列名。 - hugh-allan
显示剩余2条评论

61

在 @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)

输入图像描述


2
这真的很有效。我有一个快速的问题,有没有办法对工具提示进行排序?我的意思是x轴和y轴将首先出现,然后才是其他标签? - Joy
@Joy 看起来它想先放 x 和 y,除非你将它们移动到 geom_point 的 aes 中:p = ggplot(iris, aes(label=Species, label2=Petal.Length, label3=Petal.Width)) + geom_point(aes(Sepal.Length,Sepal.Width))。生成的图表将按照命令中出现的顺序显示工具提示。 - teadotjay
谢谢您的回复,但是我遇到了一个错误:参数3不是一个向量。有什么想法吗? - Joy
不确定;我将那行代码粘贴到 R(版本 3.2.5)中,得到了预期的图形。我正在使用 plotly 版本 3.4.13 和 ggplot2 版本 2.1.0。请查看我的更新答案以获取完整脚本。 - teadotjay
2
这在 R v4.0.3 中仍然有效。我真希望我能给这篇文章点赞两次,因为这是一个很棒的技巧。 - Nate

41

非官方的文本美学允许你引入所有想要的变量(这里我使用了两次name来展示它):

require(ggplot2)
ggplot(data = d,aes(x = seq, 
                    y = value,
                    group = 1,
                    text = paste('name: ', name,
                                 '</br>name_again: ', name)
                    ))+
  geom_line() + 
  geom_point()

正如@UweBlock所建议的,我必须为geom_line添加一个虚拟的group美学属性才能使其正常工作。

最后,我选择在工具提示中显示我想要展示的内容(这里排除了group)。

require(plotly)
ggplotly(, tooltip = c("x", "y", "text"))

1
介绍中的aes()函数中的“text”真正解决了我的问题。谢谢! - Rosemary
这感觉像黑魔法,但它确实有效! - mal
可以运行,但是有没有一种干净的方式(不是suppressWarnings)来抑制“Ignoring unknown aesthetics: text”? - Dieter Menne

15
您需要修改plotly对象来实现此操作。或者使用plot_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

太好了,它能正常工作,谢谢!我也会看一下plot_ly(),我想这可以使代码更易读,但这样我就不必强制更新所有的代码! - Malta
1
这个解决方案在本地对我有效,但是当我将应用程序放到闪亮服务器上时,额外的工具提示不在那里。然后我尝试了下面的解决方案,它有效。 - Joy
@royr2 仍然没有筛子-“公司”不会出现在工具提示中。 - Cyrus Mohammadian
@CyrusMohammadian 对我来说还不错 - 我正在使用 plotly v4.0.1 - royr2
如何使其在存在 facets 的情况下正常工作?对我来说,它只在第一个 facet 中起作用。 - mattek
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接