将 x 轴悬停从一个图共享到另一个图 -plotly R

2023-12-24

我想将鼠标悬停在x-axis of p1并让此悬停在x-axis of p2.

library(plotly)

p1 <- plot_ly(economics, x = ~date, y = ~unemploy) %>%
  add_lines(name = ~"unemploy")

p2 <- plot_ly(economics, x = ~date, y = ~uempmed) %>%
  add_lines(name = ~"uempmed")

p <- subplot(p1, p2)

p

例如,如果我将鼠标悬停在June 1992 on p1,悬停也应该发生在June 1992 on p2.

有没有办法做到这一点?这将是一些东西like https://codepen.io/p1ho/pen/VdJOZB,但图形并排。


根据您的评论,Highcharts 将作为 Plotly 的替代品。

这是一个解决方案,可以并排创建两个带有同步工具提示的图表,无论您将鼠标悬停在左侧图表还是右侧图表上。

嘿,你;来自各国的问候!顺便说一句,如果您没有正确拼写标签名称(Kat),那么不会通知我。我只是碰巧又遇到了你的问题。

我最终添加了一些故障安全代码,只有当您只有两个并排的图时,这些代码才可能真正起作用。里面有这么多数据economics,很多时候这两个提示会相差一年之久。额外的代码只是确保它们匹配。

因为我确信使用economics这不是您的最终目标,请告诉我您使用的任何配置是否不适用于此代码。

我在 Javascript 编码中添加了很多注释tags$script。我希望这些信息足以让您了解正在发生的事情。

Highcharts for R 有两种不同的绘图方法。

  • 如果您熟悉 Python 的 Plotly,它有两个版本:express 和 go。这就是 R 的 Highcharts 中发生的情况。 (hchart()更像是快递;highchart()更像是走)
  • 如果您不熟悉 Python 的 Plotly,那么最好知道绘图以hchart() or highchart()。它们的工作方式并不完全相同。

如果您想了解有关 Highcharts for R 的更多信息,在这里阅读更多相关信息 https://jkunst.com/highcharter/.

这个答案使用economics(正如您在问题中所做的那样),它来自图书馆ggplot2。此答案中使用的其他库是highcharter and htmltools。这些图表的设置与您为 Plotly 建立的问题完全相同,只是它们在 Highcharter 中呈现。

library(highcharter)
library(htmltools)

data(economics, package = 'ggplot2')

(hc1 <- highchart(elementId = "myChart") %>%
    hc_xAxis(categories = economics$date, type = "datetime") %>% 
    hc_add_series(name = "Unemployed", data = economics$unemploy) %>% 
    hc_tooltip(useHTML = T))

(hc2 <- highchart(elementId = "myChart2") %>% 
    hc_xAxis(categories = economics$date, type = "datetime") %>% 
    hc_add_series(name = "Unemployment Duration",
                  data = economics$uempmed) %>% 
    hc_tooltip(useHTML = T))

下一段代码横向对齐这两个图并建立同步的工具提示。

browsable(tagList(
  tags$script(HTML("
  setTimeout(function() {                               /* using id from div */
    $('#hc_container').bind('mousemove touchmove touchstart', function(e) {
      var chart, point, i, event;
      for (i = 0; i < Highcharts.charts.length; i++) {      /* loop through both charts */
          chart = Highcharts.charts[i];                     /* identify the chart */
          event = chart.pointer.normalize(e.originalEvent); /* find chart coordinates */
                             /* evaluate for synchronization, to address lateral charts */
          event.chartX = (event.chartX + $('[id$=Chart]').width()) % $('[id$=Chart]').width();
          point = chart.series[0].searchPoint(event, true); /* get closest point */
          if (point) {                                      /* if point found, tip it */
              point.highlight(e);                           /* trigger tooltip */
          }
      }  /* this code is to ensure the tooltips match */
      var gr = $('div.highcharts-label.highcharts-tooltip');/* collect visible tooltips */
      var gr0 = gr[0].firstChild.firstChild.textContent;    /* collect 1st x-axis tooltip text */
      var gr1 = gr[1].firstChild.firstChild.textContent;    /* collect 2nd x-axis tooltip text */
      if(gr0 !== gr1) {            /* the tips don't match due to data point proximity, fix it */
        var p = Highcharts.charts[1].series[0].points;      /* find all points in chart 1 */
        point = p.find(o => o.category === gr0);            /* get point matching chart 0 tip */
        if(point) {                                         /* if point found, tip it */
          point.highlight(e);                               /* trigger tooltip */
        }
      }
    });
  }, 500);
  Highcharts.Pointer.prototype.reset = function() {        /* reset tooltip */
    return null;
  };
  Highcharts.Point.prototype.highlight = function(event) { /* executes tooltip from trigger */
    event = this.series.chart.pointer.normalize(event);    /* capture that event occurred */
    this.onMouseOver();                                    /* show marker */
    this.series.chart.tooltip.refresh(this);               /* show tooltip */
    this.series.chart.xAxis[0].drawCrosshair(event, this); /* show crosshair */
  };
")),
div(id = "hc_container",     # this id is used in the JQuery/Javascript above
    div(hc1, style = 'height:100%; width: 50%; float:left;'), # first plot
    div(hc2, style = 'height:100%; width: 50%; float:left;'), # second plot
    style = "height:100%; width:100%; float:left;"))) # container styles
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 x 轴悬停从一个图共享到另一个图 -plotly R 的相关文章

  • 如何在本机反应中发出触摸事件

    我正在尝试启用 panResponder 以拖放模式在屏幕上移动组件 然而 这种拖放必须通过longPress在这样的元素上 longPress捕获事件 所以当panResponder已启用onStartShouldSetPanRespon
  • Apache 服务器上的服务器端 Javascript

    我们打算使用Apache https httpd apache org 用于 Web 开发的服务器 对于服务器端脚本 我们希望使用服务器端 javascript 要使服务器端 javascript 在 Apache 服务器上工作需要什么 S
  • Vue 多个组件位于一个包/文件中

    假设我想创建一个 UI 包 如何将多个组件放入一个 JS 文件中 通常我会将不同的组件放在不同的文件中 import ButtonText from ButtonText vue import ButtonIcon from ButtonI
  • 有没有一种方法可以使页面布局在 100% 缩放下完美契合,同时又尊重更大的缩放系数?

    有多种方法可以布局网页 使其适合浏览器视口 DOMwindow 当我说 适合 时 我包括更改所用字体的大小 更改 DIV IMG 和其他渲染元素的宽度和高度 以及允许元素 流畅 移动 目标是使页面在所有显示设备 从小型手机到大桌面屏幕 上看
  • 在 R 中使用 ggplot2 叠加两个图

    有两个数据框 df1 df2我需要使用 ggplot2 创建线图并显示在同一个图表上 df1 x y 2 30 4 25 6 20 8 15 df2 x y 2 12 4 16 6 20 8 24 用于绘制第一个 df p1 lt ggpl
  • 通过排列进行多组测试

    我有一个 df 其中包含与两个实验相关的两组值 value 1 和 value 2 一个实验包含两组 0 和 1 另一个实验包含三组 0 1 2 test group Value 1 Value 2 AA 0 15 1 11 2 AA 0
  • Javascript/Node 中从不执行用户代码的隐藏线程:是否可能,如果可能,是否会导致竞争条件的神秘可能性?

    根据评论 答案 请参阅问题底部的更新 这个问题实际上是关于可能性的hidden不执行回调的线程 我有一个关于潜在的神秘场景的问题 涉及节点请求模块 https www npmjs com package request其中 A 构建完整的
  • R/ggplot2:如何匹配重叠区域图中的图例和绘图颜色?

    我有两个面积图 称为 蓝色 和 绿色 其中green大部分是在blue情节 但在极少数点上 它高于blue阴谋 我想使用透明度说alpha 0 2对于两者 并且还能够为每个指定颜色 我现在的问题是 自从green情节主要是在blue地块 其
  • 适用于 HTML5 混合应用程序的 CORS

    我读过很多关于 CORS 的文章 以及允许 Access Control Allow Origin 如何成为 Web 服务器的安全漏洞 但没有一篇文章解释了如何允许 HTML5 混合应用程序访问某些不允许使用通配符 的域上托管的 Web 服
  • javascript 代码只能在函数之外工作 - 为什么?

    为什么这段代码不能像下面写的那样工作 但如果我注释掉function testBgChange 并将代码保留在该函数内 它可以正常工作 如果我将代码保留在函数中然后调用该函数 会有什么区别
  • 如何使网站适应用户的屏幕分辨率?

    我正在使用 1024x768 屏幕分辨率来设计我的网站 当您从屏幕分辨率较小 较大的计算机上的浏览器中查看网站时 网站开始变形 无论用户的屏幕分辨率是什么 如何使网站适应用户的屏幕分辨率 我相信通过 JavaScript 或 CSS 是可能
  • 带有子节点的拖放区域

    我有一个带有多个子节点的拖放区域 主要元素有dropenter and dropleave事件 但是 如果您将文件拖动到主元素内部和子节点上方 则dropleave被触发 如何处理 以便dropleave仅当拖动的元素和鼠标位于主元素之外时
  • 使用 ggplot2 在一张画布上绘制多个图形[重复]

    这个问题在这里已经有答案了 我正在尝试根据此表将两个 ggplot2 图合并为一个图 Type RatingA RatingB 1 One 3 36 2 Two 5 53 3 One 5 57 4 One 7 74 5 Three 4 38
  • Electron Auth0Lock“原始文件://不允许”

    尝试让 auth0 与我的电子应用程序一起使用 当我按照默认教程并尝试使用用户名 密码 身份验证进行身份验证时 锁定失败并显示 403 错误 并响应 不允许使用 Origin file 我还在 auth0 仪表板中客户端设置的允许来源 CO
  • 保存 dat.gui 预设以动态添加控件?

    我正在向 dat gui 界面动态添加控件 但 保存设置 功能无法识别它们 var mygui new dat GUI mygui remember mygui standard way of adding a control mygui
  • IE7 问题 - 当禁用文件下载自动提示时无法下载流式文件

    我的应用程序是基于 J2EE JSP Servlet 的 当我尝试从 JSP 打开新窗口 弹出窗口 并调用 Servlet 操作 例如 Streamer do 以在该弹出窗口内传输 PDF 文件时 我遇到了问题 问题 当 IE 7 gt 工
  • 从另一台服务器读取 Node.js 中的大文件

    我有两台相互通信的服务器 Server1 向 Server2 请求文件的部分内容 并将收到的数据存储到一个文件中 Server2 应该接收每个请求并创建一个流管道传输数据 假设服务器2中存储的文件 目录 如下 bigfile gz bigf
  • (A == B == C) 比较在 JavaScript 中如何工作?

    我预计以下比较会给出错误 var A B 0 if A B 0 console log true else console log false 但奇怪的是它又回来了false 更奇怪的是 console log A B 1 returns
  • 如何在不刷新页面的情况下更新页面 html 和 url

    我想知道是否有人可以指出我学习如何在不刷新页面的情况下更新页面 html 和 url 的方向 是否有任何现有的 javascript 库可以处理这个问题 或者有一本涵盖此类事情的好书 这是使用该效果的示例网站 http onedesignc
  • 如何防止IE11弹出(您确定要离开此页面)

    我正在处理一个页面 除了一个下拉菜单可供选择外 我无需输入任何内容 但在 IE11 中 当我尝试转到下一页时 它会弹出该消息 我想阻止这种弹出的发生 所以我只是想知道 IE11 中弹出窗口的默认行为是什么 因为它不会出现在 Chrome 或

随机推荐