47

我有一个简单的数据框:

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 的答案。

4

4 回答 4

71

您不需要plotly按照@royr2 的建议修改对象。只需添加label = name为第三美学

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

name除了seq和之外,还会显示工具提示value

ggplotly帮助文件说明了参数tooltip

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

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

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

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美学可能会变得有用。labelgeom_text

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

于 2016-03-31T23:08:37.630 回答
49

基于@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)

在此处输入图像描述

于 2016-07-27T18:53:02.160 回答
31

非官方的text审美允许你引入所有你想要的变量(这里我用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 建议的那样,我必须添加一个虚拟group美学geom_line才能正常工作。

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

require(plotly)
ggplotly(, tooltip = c("x", "y", "text"))
于 2017-05-03T14:37:22.337 回答
13

您必须修改plotly object才能执行此操作。或者使用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
于 2016-03-31T06:13:21.727 回答