【问题标题】:Exclude line/points from showing info when using add_tooltip with hover in ggvis在ggvis中使用带有悬停的add_tooltip时从显示信息中排除线/点
【发布时间】:2015-07-05 12:04:08
【问题描述】:

我一直在玩漂亮的 ggvis 包。我正在做一个自定义线性回归,并想要一个工具提示来显示有关每个数据点的信息。但是,当我添加回归线时,工具提示会在我将鼠标悬停在线时出现,然后显示有关第一个数据点的信息(参见屏幕截图)。我提供了这个简单的可重现示例:

library(ggvis)
mtc <- mtcars
lm=with(mtc,lm(mpg~wt))
mtc$fit=lm$coefficients[1]+mtcars$wt*lm$coefficients[2]
mtc$id <- 1:nrow(mtc)  # Add an id column to use ask the key

all_values <- function(x) {
    if(is.null(x)) return(NULL)
    row <- mtc[mtc$id == x$id, ]
    paste0(names(row), ": ", format(row), collapse = "
           ")
}

mtc %>% ggvis(x = ~wt, y = ~mpg, key := ~id) %>%
    layer_points() %>%layer_lines(x= ~wt,y= ~fit)%>% 
    add_tooltip(all_values, "hover")

这会产生 this

我想从工具提示中排除回归线,因此它只显示有关数据点的信息。有没有办法做到这一点?感谢您的帮助!

【问题讨论】:

    标签: r ggvis


    【解决方案1】:

    玩了一会儿后,我开始工作了。

    首先,我需要构建两个单独的数据集才能使其正常工作。一个用于线性模型数据,一个用于 mtcars。

    解决方案

    构建数据

    mtc <- mtcars
    mtc$id <- 1:nrow(mtc) 
    
    lm=with(mtc,lm(mpg~wt))
    df=data.frame(fit=lm$coefficients[1]+mtcars$wt*lm$coefficients[2])
    df$id <- 101:132
    df$wt <- mtcars$wt
    

    如您在上面看到的,mtc 是 mtcars 数据的数据,df 是线性模型数据。请注意,我在 df 中添加了一个 id 列,其所有值都大于 100,并且与 mtc data.frame 完全不同。

    当您将鼠标悬停在点上时,all_values 将从 mtc 访问 id 列,并且每当您将鼠标悬停在 all_values 行上时,将访问来自 df 的 id 列。

    我在下面的函数中添加了一行代码:

    all_values <- function(x) {
      #if the id is greater than 100 i.e. the df data.frame
      #then return NULL
      if(x$id>100) return(NULL)
      if(is.null(x)) return(NULL)
      row <- mtc[mtc$id == x$id, ]
      paste0(names(row), ": ", format(row), collapse = "
               ")
    }
    

    然后绘制两个单独的 data.frames。 add_tooltip 将为两个 data.frames 找到 id 变量:

    ggvis(x=~wt) %>%
         layer_points(data=mtc, y = ~mpg, key := ~id) %>%
         layer_paths(data=df,y= ~fit, key := ~id) %>%
         add_tooltip(all_values, "hover")
    

    我无法显示与此图表的完整交互性,但您可以在下图中看到,虽然我的光标位于该行上方,但没有显示任何信息。

    而当鼠标悬停时,这些点会显示信息。

    【讨论】:

    • 不错的解决方法。我不得不在 Shiny 应用程序中做一次类似的事情;不是很优雅。 Hadley 和 Winston 正在开发此功能:groups.google.com/forum/#!topic/ggvis/ktlFHhYcORM
    • 完美运行!使用 layer_paths() 而不是 layer_lines 的原因是什么?另外,df数据名是否需要id,即ggvis图的每一层都应用all_values函数吗?
    • @StevenBeaupré 哦,非常感谢!很高兴知道它:)
    • @Sölvi 我使用了layer_paths,因为它适用于多个数据集。 layer_lines 似乎失败了。至于 df data.frame 中的 id 列,可能不一定需要。当您将鼠标悬停在线上时,all_values 中的 x 变为 df。因此,您可以在 if 条件中使用哪个值/列来使其返回 NULL。您需要使用条件,否则 all_values 将失败。你已经为 mtc data.frame 使用了一个 id,所以我使用相同的 :)
    猜你喜欢
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2018-10-08
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多