用于geom_text和geom_segment的ggplotly工具提示;在Mac上不起作用

时间:2016-12-11 03:06:29

标签: windows macos ggplot2 tooltip plotly

我正在修改CRAN包。我有一个函数调用似乎只会导致Mac上的错误。它在CRAN上的r-release-osx-x86_64-mavericks上引起了错误。我在El Capitan和Mavericks上运行它,并且在这两个Mac版本上也产生了同样的错误。 CRAN(solaris,linux,windows)检查的所有其他系统都没有导致错误。

我创建了函数调用的MWE,如下所示(抱歉,创建数据的时间很长)。基本上,它首先使用3个数据帧创建ggplot2数字(edgeDF - 所有非路径边,nodeDF - 所有非路径节点,pathDF - 边缘和感兴趣路径的节点):

set.seed(1)
label=c()
for (i in 1:10){
  label[i] = paste(sample(letters,sample(3:10, 1),replace=TRUE),collapse='')  
}
nodeDF = data.frame(label = label, x = runif(10,0,10), y = runif(10,0,10))

edgeDF = data.frame()
edgeDF = rbind(edgeDF, c(x=nodeDF[1,]$x, xend=nodeDF[1,]$y, y=nodeDF[2,]$x, yend=nodeDF[2,]$y))
edgeDF = rbind(edgeDF, c(x=nodeDF[5,]$x, xend=nodeDF[5,]$y, y=nodeDF[6,]$x, yend=nodeDF[6,]$y))
colnames(edgeDF) = c("x","y","xend","yend")

r1=runif(1,0,10)
r2=runif(1,0,10)
r3=runif(1,0,10)
r4=runif(1,0,10)

label=c()
for (i in 1:3){
  label[i] = paste(sample(letters,sample(3:10, 1),replace=TRUE),collapse='')  
}
xend = c(r1, r2, runif(1,0,10))
xstart = c(runif(1,0,10), r1, r2)
yend = c(r3, r4, runif(1,0,10))
ystart = c(runif(1,0,10), r3, r4)

pathDF = data.frame(label=label,xstart=xstart,ystart=ystart,xend=xend,yend=yend,x=xstart,y=ystart)

edgeCol="gray84"
pathEdgeCol="seagreen"
nodeCol="black"

plotTotalImage = ggplot2::ggplot(data = nodeDF, ggplot2::aes(x = x, y = y)) +
  ggplot2::geom_segment(data = edgeDF, ggplot2::aes(x=x, y=y, xend=xend, yend=yend), colour = edgeCol) +
  ggplot2::geom_segment(data = pathDF, ggplot2::aes(x=xstart, y=ystart, xend=xend, yend=yend), colour = pathEdgeCol) +
  ggplot2::geom_text(data = nodeDF, ggplot2::aes(x = x, y = y, label = label), colour = nodeCol)

plotTotalImage = plotTotalImage + ggplot2::geom_text(data = pathDF,ggplot2::aes(x = x, y = y, label = label), fontface= "bold")

我调用geom_segment来创建边缘(灰色的是偏离路径,绿色的是路径)。我调用geom_text来创建节点标签(非粗体的是偏离路径,粗体的是路径)。这样可以成功创建静态图像。

此时,我想使用plotly为绘图添加交互性。我不希望信息悬停在细分市场上;我只想要信息悬停在节点标签上。当鼠标悬停在节点标签上时,我希望显示x值和标签名称。

以下代码在Windows上按预期工作:

animatePlotTotalImage <- plotly::plotly_build(plotly::ggplotly(plotTotalImage, tooltip = c("x", "label")))
animatePlotTotalImage$data[[1]]$hoverinfo <- "none"
animatePlotTotalImage$data[[2]]$hoverinfo <- "none"
animatePlotTotalImage$data[[3]]$hoverinfo <- c("x+text")
animatePlotTotalImage$data[[4]]$hoverinfo <- c("x+text")
animatePlotTotalImage 

但是,在Mac上,会导致以下错误:

Error in `*tmp*`[[2]] : subscript out of bounds

我不确定如何解决这个问题。任何想法或建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

我可能错了,但我认为你的陈述中遗漏了$x

这对我有用(mac Sierra):

animatePlotTotalImage <- plotly::plotly_build(plotly::ggplotly(plotTotalImage, tooltip = c("x", "label")))
animatePlotTotalImage$x$data[[1]]$hoverinfo <- "none"
animatePlotTotalImage$x$data[[2]]$hoverinfo <- "none"
animatePlotTotalImage$x$data[[3]]$hoverinfo <- c("x+text")
animatePlotTotalImage$x$data[[4]]$hoverinfo <- c("x+text")