R 中的交互式散点图,overlay/hover summary/tooltip 作为用户提供的绘图函数

Interactive scatter plots in R, overlay/hover summary/tooltip as user supplied plot function

我一直在研究 R 中的交互式绘图。我知道有几个软件包可以创建交互式绘图,尤其是散点图,但我正在寻找特定的功能。

例如this plot。可以将鼠标悬停在按钮上以获得点后数据的小数字摘要,即工具提示。

当您的数据集包含更多变量时,explore/visualize 从 PCA 得分或进行多维缩放 (MDS) 通常会很好。但是,如果以交互方式绘制数据,如上例所示,将鼠标悬停在该点上时的摘要不会提供太多信息,即只是一长串数字。如果能够生成要显示的自定义绘图,而不是仅显示数值,那就更好了。

所以我的问题是:

是否有可能(在 R 中可用的一些包中)在将鼠标悬停在散点图中的一个点上时生成视觉摘要。这可能是一个条形图,或者只是一些用户指定的绘图函数,它从 data.frame 中获取一行作为参数。

如果这是可能的,那么将大大有助于快速理解 MDS 的结果。

编辑:

下面是一些在 iris 数据集上做 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 个数值更多。

如果您使用的是 RStudio,那么 plotly 包应该足够友好,可以使用。 例如:

library(ggplot2)
library(plotly) 
p <- ggplot(iris, aes(Sepal.Length, Petal.Length, colour=Species)) + geom_point()
 ggplotly(p)

悬停在一个点上时显示的信息如下:

如果你使用最新开发版的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 允许您指定任意 html 作为工具提示,所以这里我们根据数据值(用 @sw 引用等)创建具有指定宽度的 div。 ) 创建条形图。

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