使用ggplotly时如何选择要在工具提示中显示的变量?
How to choose variable to display in tooltip when using 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)
我想这样画:
require(ggplot2)
ggplot(data = d,aes(x=seq,y=value))+geom_line() + geom_point()
现在我想使用 plotly,主要是为了能够在将鼠标悬停在某个点上时获取值以外的其他信息,例如公司名称。我试试这个:
require(plotly)
ggplotly()
这给我一个工具提示,但只有 seq 和 value。我尝试了选项 tooltip= 但它指定您可以使用美学中描述的唯一变量,而我没有在我的 aes 中使用该名称。
有什么解决办法吗?我看到我不是第一个遇到这个问题的人,但我还没有找到使用 ggplotly 的答案。
您必须修改 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
您不需要按照@royr2 的建议修改plotly
对象。只需添加 label = name
作为第三种美学
ggplot(data = d, aes(x = seq, y = value, label = name)) + geom_line() + geom_point()
并且工具提示将显示 name
除了 seq
和 value
。
ggplotly
帮助文件说 tooltip
参数:
The default, "all", means show all the aesthetic mappings (including the unofficial "text" aesthetic).
因此您可以使用 label
美学,只要您不想将其用于 geom_text
。
顺便说一句:我也试过 text
而不是 label
ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line() + geom_point()
但后来ggplot2
抱怨
geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?
并且只绘制点。我不得不向 geom_line
添加一个虚拟组以解决问题:
ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line(group = 1) + geom_point()
(但请注意,如果您将虚拟组作为第四美学放在 aes()
中,它默认也会出现在工具提示中。)
但是,我发现非官方的 text
审美可以与 label
一起变得有用,如果你想让 geom_text
绘制不同的字符串并显示在工具提示中。
编辑以回答评论中的问题:
tooltip
到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)
非官方的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()
我必须为 geom_line
添加一个虚拟的 group
美学才能像@UweBlock 建议的那样正常工作。
最后我选择了我想在工具提示中显示的内容(这里我排除了group
)。
require(plotly)
ggplotly(, tooltip = c("x", "y", "text"))
我有一个简单的数据框:
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 的答案。
您必须修改 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
您不需要按照@royr2 的建议修改plotly
对象。只需添加 label = name
作为第三种美学
ggplot(data = d, aes(x = seq, y = value, label = name)) + geom_line() + geom_point()
并且工具提示将显示 name
除了 seq
和 value
。
ggplotly
帮助文件说 tooltip
参数:
The default, "all", means show all the aesthetic mappings (including the unofficial "text" aesthetic).
因此您可以使用 label
美学,只要您不想将其用于 geom_text
。
顺便说一句:我也试过 text
而不是 label
ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line() + geom_point()
但后来ggplot2
抱怨
geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?
并且只绘制点。我不得不向 geom_line
添加一个虚拟组以解决问题:
ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line(group = 1) + geom_point()
(但请注意,如果您将虚拟组作为第四美学放在 aes()
中,它默认也会出现在工具提示中。)
但是,我发现非官方的 text
审美可以与 label
一起变得有用,如果你想让 geom_text
绘制不同的字符串并显示在工具提示中。
编辑以回答评论中的问题:
tooltip
到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)
非官方的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()
我必须为 geom_line
添加一个虚拟的 group
美学才能像@UweBlock 建议的那样正常工作。
最后我选择了我想在工具提示中显示的内容(这里我排除了group
)。
require(plotly)
ggplotly(, tooltip = c("x", "y", "text"))