在R中创建交互式散点图,叠加/悬停摘要/工具提示作为用户提供的绘图函数。

8
我一直在研究R中的交互式绘图。我知道有几个包可以创建交互式绘图,特别是散点图,但我正在寻找某些功能。
例如此绘图。人们可以用鼠标悬停在按钮上,以获取有关该点后面数据的小数字摘要,即工具提示。
当您有一个具有更多变量的数据集时,通常很好探索/可视化来自PCA的分数,或进行多维缩放(MDS)。但是,如果像上面的示例那样以交互方式绘制数据,则悬停在点上时的摘要提供的信息不多,即只有一长串数字。能够生成自定义绘图以显示将更好,而不仅仅是显示数字值。
因此,我的问题是:
是否可能(在R中可用的某些包中)在散点图上悬停在点上时生成视觉摘要。这可以是条形图,也可以是一些用户指定的绘图函数,该函数以数据框的一行作为参数。
如果可能的话,这将极大地帮助快速了解MDS结果。
编辑:
以下是对鸢尾花数据集执行MDS的代码:
library(ggplot2)
library(plotly)
d <- dist(iris[,-5]) # euclidean distances between the rows
fit <- cmdscale(d,eig=TRUE, k=2) # k is the number of dim

# Put coordinates and original data in one data.frame
x <- fit$points[,1]
y <- fit$points[,2]
pDat <- data.frame(x=x,y=y)
pDat <- cbind(pDat,iris)
p <- ggplot(pDat) + geom_point(aes(x,y))
ggplotly(p)

首先,现在工具提示只包括x、y坐标。我希望工具提示包含原始4个变量的值。然后,我想要将工具提示显示为条形图,而不是数据点后面的原始4个变量。MDS保留了数据点之间的距离,因此用户可以逐渐用鼠标悬停,看到条形图几乎连续地变化,因为距离被保留。在我的使用情况中,每个点后面有30个变量,因此条形图摘要比30个数值提供更多的视觉信息。


2
我能想到的唯一解决方案是使用shiny。这里有一个例子:https://plot.ly/r/shiny-coupled-events/ - royr2
@royr2 谢谢!这看起来是一个不错的开始,我可以在每个点旁边的图中总结信息!如果有人有工具提示解决方案,那将可能提供更流畅的用户体验,我仍然很感兴趣。 - Gumeo
2个回答

13

如果您正在使用RStudio,那么plotly包应该足够友好以供使用。例如:

library(ggplot2)
library(plotly) 
p <- ggplot(iris, aes(Sepal.Length, Petal.Length, colour=Species)) + geom_point()
 ggplotly(p)
当光标悬停在某个点上时,显示的信息如下所示:

enter image description here


谢谢你的回答。我已经稍微尝试了一下plotly,并且想要比带有数字提示的tooltip更多的功能。我想要替换用户指定的绘图函数中出现的绿色提示框。 - Gumeo
@Gumeo 不太确定你想要 hoverinfo 显示什么。无论如何,请参考 https://plot.ly/r/text-and-annotations/ 并查看自定义悬停文本的示例。也许那正是你想要的。 - Adam Quek
是的,我希望hoverinfo是一个图而不是文本。我会尝试编辑我的问题以使这一点更清楚。 - Gumeo

4
如果您使用最新的rbokeh开发版本,您可以通过以下方式实现您想要的功能:
devtools::install_github("bokeh/rbokeh@v0.6.3")

library(rbokeh)

iris$sw <- paste0(iris$Sepal.Width * 20, "px")
iris$pw <- paste0(iris$Petal.Width * 20, "px")
iris$sl <- paste0(iris$Sepal.Length * 20, "px")
iris$pl <- paste0(iris$Petal.Width * 20, "px")

style_str <- "white-space: nowrap; border: 1px solid white; background: steelblue; height: 15px;"

figure() %>%
  ly_points(x = Sepal.Width, y = Sepal.Length, color = Species,
  data = iris, hover = glue::glue("
<div>
  <div style='{style_str} width: @sw'>Sepal width</div>
  <div style='{style_str} width: @pw'>Petal Width</div>
  <div style='{style_str} width: @sl'>Sepal width</div>
  <div style='{style_str} width: @pl'>Petal Length</div>
</div>
"))

rbokeh条形图工具提示

这里发生的情况是,rbokeh允许您指定任意的html作为工具提示。因此,在这里,我们创建了一个div,根据数据值(使用@sw等引用)指定宽度,以创建条形图。

上面的示例适用于简单的条形图,但如果您想要能够在工具提示中显示任意图像,则一种方法是为每个数据点预先生成光栅图像,并将其嵌入作为HTML工具提示(使用base64编码的图像作为src的img标签)。


谢谢,这正是我在寻找的! - Gumeo
嗨,我尝试将图像添加到工具提示中,但无法使其正常工作。你有关于如何实现这一点的示例吗?欢迎任何建议! - Marcelo Araya-Salas

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