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

How to choose variable to display in tooltip when using ggplotly?

提问人:Malta 提问时间:3/31/2016 最后编辑:MLavoieMalta 更新时间:5/15/2018 访问量:54751

问:

我有一个简单的数据框:

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()

这给了我一个工具提示,但只有 seq 和 value。我尝试了选项 tooltip=,但它被指定您可以使用美学中描述的唯一变量,并且我没有在我的 aes 中使用该名称。

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

r-plotly ggplotly

评论


答:

15赞 royr2 3/31/2016 #1

为此,您必须修改 。或者改用创建图表...plotly objectplot_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

评论

0赞 Malta 3/31/2016
太好了,它有效,谢谢!我也会看一看plot_ly(),我想这可以提供更具可读性的代码,但这样我就不会强迫更新我所有的代码!
1赞 Joy 7/29/2016
这个解决方案在本地对我有用,但是当我将应用程序放在闪亮的服务器上时,额外的工具提示不存在。然后我尝试了下面的解决方案,这很有效。
0赞 Cyrus Mohammadian 8/3/2016
@royr2仍然没有骰子 - “公司”没有出现在工具提示中
0赞 royr2 8/3/2016
@CyrusMohammadian对我来说似乎没问题 - 我正在使用plotly v4.0.1
0赞 Cyrus Mohammadian 8/4/2016
@royr2有趣的是,我使用的是 3.6.0 版本,我刚刚从 CRAN 重新安装了它,它仍然是同一个版本,您是从 github 安装的吗?
82赞 Uwe 4/1/2016 #2

您无需按照@royr2的建议修改对象。只需添加为第三种美学plotlylabel = name

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

并且工具提示将显示除 和 之外的 。nameseqvalue

帮助文件说明了参数:ggplotlytooltip

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

所以只要你不想用它来使用,你就可以使用美学。labelgeom_text

顺便说一句:我也试过而不是textlabel

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()

但是,我发现如果您想在工具提示中绘制和显示不同的字符串,那么非官方的美学可能会变得很有用。textlabelgeom_text

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

评论

0赞 Malta 4/1/2016
谢谢,在我看来,这是获得我想要的东西的一种更具可读性的方式。如果有人想使用geom_text,那么 aes 应该直接放在 geom_line 和 geom_text中。
1赞 Jack H 8/10/2017
除了添加其他标签外,是否可以删除默认标签?
0赞 Uwe 8/10/2017
@VisionIncision是的。我已经相应地更新了我的答案。
0赞 Jack H 8/16/2017
@UweBlock 感谢您到目前为止的帮助。对不起,我应该更清楚,出于某种原因,我创建情节的方式(可能是因为我是用闪亮的方式做的),如果我使用任何工具提示参数,它似乎没有区别。所以我想知道我是否可以在 aes() 函数中做些什么,比如如何使用 label=、label2= 等添加它们以删除默认标签。
1赞 hugh-allan 4/27/2022
我发现,如果您使用工具提示信息将显示,而如果您使用工具提示,则只会显示。这对我来说很有用,因为我已经在它自己的列中创建了工具提示信息,并且在使用它时烦人地在标签的开头包含了列的名称。label = namename: companyXtext = namecompanyXstr_c('Line 1: ', line1_col, '<br> Line 2: ', line2_col', ...)label =
61赞 teadotjay 7/28/2016 #3

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

enter image description here

评论

2赞 Joy 7/29/2016
这确实有效。我有一个简单的问题,有什么方法可以订购工具提示吗?我的意思是 x 轴和 y 轴将首先是第一个,然后是其他标签?
0赞 teadotjay 7/29/2016
@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))
0赞 Joy 7/29/2016
感谢您的回复,但我收到错误:参数 3 不是向量。有什么想法吗?
0赞 teadotjay 7/29/2016
不确定;我将该行粘贴到 R(版本 3.2.5)中并得到了预期的绘图。我正在使用 plotly 版本 3.4.13 和 ggplot2 版本 2.1.0。有关完整脚本,请参阅我更新的答案。
2赞 Nate 3/5/2021
这在 R v4.0.3 中仍然有效。我真的希望我能对这篇文章投两次票,因为这是一个很棒的技巧
41赞 DAVL 5/3/2017 #4

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

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的建议正常工作。groupgeom_line

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

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

评论

1赞 Rosemary 7/18/2020
在 aes() 中引入“文本”确实解决了我的问题。谢谢!!
0赞 mal 9/2/2021
这感觉像黑魔法,但它有效!
0赞 Dieter Menne 8/2/2022
这很好用,但是有没有一种干净的方法(不是 suppressWarnings)来抑制“忽略未知的美学:文本”