R:向 Plotly 添加搜索栏

2024-03-11

我在这里找到了这个 stackoverflow 帖子(从浏览器中突出显示/查找散点图中的数据点 https://stackoverflow.com/questions/42507096/highlight-find-data-points-in-plotly-scatter-from-the-browser),其中展示了如何在绘图中为散点图创建搜索栏。

我尝试运行此示例中提供的代码:

library(plotly)
library(htmlwidgets)
library(htmltools)

pcaCars <- princomp(mtcars, cor = TRUE)
carsHC <- hclust(dist(pcaCars$scores), method = "ward.D2")

carsDf <- data.frame(pcaCars$scores, "cluster" = factor(carsClusters))
carsClusters <- cutree(carsHC, k = 3)

carsDf <- transform(carsDf, cluster_name = paste("Cluster", carsClusters))

p <- plot_ly(carsDf, x = ~Comp.1 , y = ~Comp.2, text = rownames(carsDf),
             mode = "markers", color = ~cluster_name, marker = list(size = 11), type = 'scatter', mode = 'markers')

p <- htmlwidgets::appendContent(p, htmltools::tags$input(id='inputText', value='Merc', ''), htmltools::tags$button(id='buttonSearch', 'Search'))
p <- htmlwidgets::appendContent(p, htmltools::tags$script(HTML(
  'document.getElementById("buttonSearch").addEventListener("click", function()
    {        
      var i = 0;
     var j = 0;
      var found = [];
      var myDiv = document.getElementsByClassName("js-plotly-plot")[0]
      var data = JSON.parse(document.querySelectorAll("script[type=\'application/json\']")[0].innerHTML);
      for (i = 0 ;i < data.x.data.length; i += 1) {
        for (j = 0; j < data.x.data[i].text.length; j += 1) {
          if (data.x.data[i].text[j].indexOf(document.getElementById("inputText").value) !== -1) {
            found.push({curveNumber: i, pointNumber: j});
          }
        }
      }
      Plotly.Fx.hover(myDiv, found);
    }  
  );')))                                                    

htmlwidgets::saveWidget(p, paste('pca', ".html", sep=""))
p

该代码似乎可以运行,但我没有看到搜索栏:

有人可以告诉我我做错了什么以及如何解决这个问题吗?

Thanks!


另存为 HTML

使用 Crosstalk 时,最简单的途径可能是通过 RStudio 中的查看器窗格导出。

添加重置按钮;多项选择;减小搜索栏大小

重置按钮:要添加重置选项,您需要一点 JS。 (我稍后会回来讨论这一点。)

多项选择:要设置此项以便从下拉列表中选择一项或多项,请在调用 filter_select 时更改参数multiple = F to T.

搜索栏宽度:可以通过 R 代码或 JS 设置搜索栏的宽度。对于 R,使用参数widths在函数中bscols。为每个项目设置宽度。全宽始终为 12,因此如果您希望搜索栏为绘图宽度的一半,但您想要两行,则可以使用width = c(6, 12)。 (如果您的widths总数超过 12。不过,这只是一个警告。)

所有这些示例都假设 ID 在filter_select is lantern。如果你在这个函数里改的话,那么到处都得改。

question_filter <- crosstalk::filter_select(
  "lantern", "Select a group to examine",
  sd, ~filterBy, multiple = T
)

最简单的变化

这是很简单的,但可以实现你想要的。

这需要图书馆htmltools.

bscols(widths = c(6, 6, 12),
       question_filter, 
       div(id = "yayButtons",
           tags$script(HTML(
             "setTimeout(function(){ 
             $('#yayButtons').append(         /* create and add button */
             '<button class=\"forStylin\" type=\"button\"' +
             'onClick=\"window.location.reload()\">' +  /* reset action */
             'Click Me to Reset Plot</button>');
             }, 10)"))),
       plot)

备用搜索栏宽度设置

如果你想用 JS 设置搜索栏的宽度,你可以将其添加到绘图中htmlwidgets::onRender。您也可以将其添加到setTimeout函数在中间。这是一个附加在绘图上的示例(只是为了更容易看到它)。

bscols(widths = c(6, 6, 12),
       question_filter, 
       div(id = "yayButtons",
           tags$script(HTML(
             "setTimeout(function(){
             $('#yayButtons').append(         /* create and add button */
             '<button class=\"forStylin\" type=\"button\"' +
             'onClick=\"window.location.reload()\">' + /* reset action */
             'Click Me to Reset Plot</button>');
             }, 10)"))),
       plot %>% htmlwidgets::onRender(
         "function(){
         gimme = document.getElementById('lantern');
         gimme.style.width = '25%';       /* too small, but you get the point */
         }"))

为重置按钮添加样式

我知道如果我有一个按钮和一个搜索栏,我希望它们的外观至少有些相似。这是第一个版本的更复杂的变体。这个为重置按钮添加了样式。我添加了很多东西,以便您可以看到一些选项。

bscols(widths = c(6, 6, 12),
       question_filter, 
       div(id = "yayButtons",
           tags$script(HTML(
             "setTimeout(function(){
             $('#yayButtons').append(          /* create and add button */
             '<button class=\"forStylin\" type=\"button\"' +
             'onClick=\"window.location.reload()\">' + /* reset action */
             'Click Me to Reset Plot</button>');
             }, 10)")),
           tags$style(HTML(
             "div#yayButtons {     /* this centers the button in its area */
             display: flex;
             justify-content: center;
             }
             .forStylin {
             font-size: 1rem;    /* from input bar */
             font-family: times; /* from input bar */
             margin-top: 1rem;   /* inline with dropdown box */
             min-height: 34px;   /* attr of input box */
             background-color: rgb(31, 119, 180); /* plotly point color */
             color: white;
             }"
           ))),
       plot)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R:向 Plotly 添加搜索栏 的相关文章

随机推荐

  • Xcode 4 的调试区域变量列表中的图标是什么意思?

    有谁能够提供 Xcode 4 调试区域变量列表中标记图标的明确指南吗 这是我目前拥有的清单 我不明白他们的意思 这不直观 例如 我有 BOOL 和 NSMutableString 对象 它们都带有绿色的 i 图标 我无法在 Xcode 文档
  • PlayFramework 多个 SLF4J 绑定

    我正在尝试完成一些模型的一些基本单元测试 但是我收到以下错误 现在看来我有两个 SLF4J 绑定 这是因为我使用的是 Mahout 它有一个版本的 SLF4J 而 Play 有它自己的版本 谁能告诉我如何解决这个问题 SLF4J 参见htt
  • 在 WooCommerce 中的产品 (Schema.org) 的结构化数据中添加 ean 代码 (gtin)

    我使用此代码片段在 Woocommerce 的产品架构中显示 gtin 的 ean 值 add filter woocommerce structured data product filter woocommerce structured
  • 将类实例存储到文件/数据库的最佳方法

    将类的实例存储到文件 数据库的最佳方法是什么 我们有一个名为 Command 的基类和大量派生类 用户通过向图形设计器添加命令来创建这些类的实例 他们可以在哪里配置它们 设置属性 然后我们需要一种方法将这些 命令 存储到文件中而不丢失 任何
  • 如何在opencv 4.1.0中实现LSD

    我在我的开放简历项目中实施了 LSD 一切都很顺利 直到我将 opencv 版本从 4 0 0 升级到 4 1 0 现在我得到的错误是 cv2 error OpenCV 4 1 0 io opencv modules imgproc src
  • 是否可以在 Android Studio 中本地调试 Google Play 的应用内结算?

    我在本地测试应用内订阅产品时遇到此错误 需要进行身份验证 您需要登录您的谷歌帐户 我能够检查该产品的库存 但我是否也应该能够购买它 有很多关于为什么会发生此错误的帖子 我认为这些帖子已得到解决 该产品在测试版渠道中发布 并启用应用内计费 我
  • Python,通过提取字符和数字子串来解析字符串

    我有一个字符串 是由某种机器学习算法产生的 通常由多行组成 在开头和结尾处可以有一些不包含任何字符 空格除外 的行 并且在它们之间应该有 2 行 每行包含一个单词 后跟一些数字和 有时 其他字符 像这样的东西 first word 3 5
  • .NET 代码混淆真的值得吗?

    据我所知 代码混淆其实并不难 破解 它只会推迟不可避免的事情 那么 它的目的是什么 如果有人真的想窃取您的资源 他们可以 如果有人出于无害 有用的目的需要查看您的源代码 他们就不能 您可能不应该在代码中存储任何敏感内容 因此这不应该成为问题
  • OFFSET 命令附近的语法不正确

    为什么这不起作用并给我一个 偏移命令附近的语法不正确 错误 SELECT o orderdate o orderid o empid o custid FROM Sales Orders o ORDER BY o orderdate o o
  • 实时绘制 pandas 数据框

    我是新来的matplotlib并尝试显示我通过函数 read API 从 api 下载的三个变量的最后一小时数据的实时图 数据位于带有 DateTimeIndex 的 pandas 数据框中 例如 In dframe head Out A
  • 如何获取ContainerRequest中的会话对象可以使用注释@RolesAllowed(Role_user)?

    我正在使用 App Engine 和 Jersey 构建一个应用程序 我想使用注释 RolesAllowed Role user 谁允许在请求中创建过滤器 问题是我们需要配置类SecurityContextFilter 我的目标是获得id存
  • 编译 Lua - 创建 .so 文件?

    我正在 Centos 6 5 上编译 Lua 5 2 3 编译 安装工作正常 但是 我还需要编译另一个程序的开发库 我通常会通过这样做来安装它们 yum install lua devel 问题是安装 Lua 5 1 共享库 而不是 5 2
  • 是否可以在android的上下文菜单(系统菜单)中添加一些项目

    当我输入一些文本并按住它时 上下文菜单会显示剪切 复制 选择文本等项目 有什么方法可以将我自己的自定义项目添加到此上下文菜单中吗 我不知道这件事是如何工作的 但我想应该可以在清单中注册一些东西 就像注册活动和广播一样 Thanks 欢迎任何
  • Android 房间@Relation 左加入

    假设我有两个实体 问题和答案 它们具有一对多关系 每个问题可能有 0 n 个答案 它们定义为 Entity tableName questions data class Question PrimaryKey val id Long val
  • 在 qt linux 中保存配置

    我为Linux编写了一个qt应用程序 该应用程序应该在启动时运行 我 用桌面条目做的 但我需要它更复杂 用户应该检查一个复选框 以便选择应用程序是否在启动时运行 我该如何保存他的偏好 该应用程序之前是为 Windows 编写的 并且保存在注
  • 如何更改 AlertDialog 的主题

    我想知道是否有人可以帮助我 我正在尝试创建一个自定义的 AlertDialog 为了做到这一点 我在 styles xml 中添加了以下代码行
  • 创建一个圆形的 Java Swing JFrame?

    如果可能的话如何制作一个圆形的JFrame Oracle 有一个关于这个主题的很好的教程 https docs oracle com javase tutorial uiswing misc trans shape windows html
  • 如何在 Play 2.0 (Scala) 中使用 DATABSE_URL 进行与 PostgreSQL 9.1 和 Heroku 的本地连接?

    我使用 Play 在 OSX Lion 10 7 4 上使用本地 PostgreSQL 9 1 开发了第一个 Web 应用程序 框架2 0 3 我从conf application conf 相对于应用程序目录 中定义的数据库连接开始 db
  • 如何在Windows下使用特定的server.xml启动Tomcat?

    有时我想使用特殊配置启动 Tomcat 6 而不是使用 server xml 所以我创建了另一个名为的 xml 文件server test xml 现在我想告诉tomcat使用这个配置 这是怎么做到的 我在网上搜索几乎找不到任何东西 只有这
  • R:向 Plotly 添加搜索栏

    我在这里找到了这个 stackoverflow 帖子 从浏览器中突出显示 查找散点图中的数据点 https stackoverflow com questions 42507096 highlight find data points in