向 Google 蜡烛图添加注释(发布的解决方案会触发 TypeError)

2023-12-10

我正在尝试向 Google Candlestick 图表添加一些注释。我注意到有人已经问过同样的问题(向 Google 烛台图表添加注释)。用户Aperçu回复了详细的解决方案来扩展图表并添加注释,因为图表没有内置任何此类功能。但是,当我尝试此解决方案时,我收到错误“TypeError: document.querySelectorAll(...)[0]未定义”

这是我的代码:

        chartPoints = [
            ['Budget', 0, 0, 9999, 9999, 'foo1'],
            ['Sales', 0, 0, 123, 123, 'foo2'],
            ['Backlog', 123, 123, 456, 456, 'foo3'],
            ['Hard Forecast', 456, 456, 789, 789, 'foo4'],
            ['Sales to Budget', 789, 789, 1000, 1000, 'foo5']
        ];
        var data = google.visualization.arrayToDataTable(chartPoints, true);
        data.setColumnProperty(5, 'role', 'annotation');
        var options = {
            legend: 'none',
            bar: { groupWidth: '40%', width: '100%' },
            candlestick: {
                fallingColor: { strokeWidth: 0, fill: '#a52714' },
                risingColor: { strokeWidth: 0, fill: '#0f9d58' }
            }
        };    

        var chart = new google.visualization.CandlestickChart(document.getElementById('chart_div'));
        chart.draw(data, options);

        // attempt to use Aperçu's solution
        const bars = document.querySelectorAll('#chart_div svg > g:nth-child(5) > g')[0].lastChild.children // this triggers a TypeError
        for (var i = 0 ; i < bars.length ; i++) {
          const bar = bars[i]
          const { top, left, width } = bar.getBoundingClientRect()
          const hint = document.createElement('div')
          hint.style.top = top + 'px'
          hint.style.left = left + width + 5 + 'px'
          hint.classList.add('hint')
          hint.innerText = rawData.filter(t => t[1])[i][0]
          document.getElementById('chart_div').append(hint)
        }

我希望图表显示条形图旁边的最后一条数据(即“foo1”、“foo2”等)


每个蜡烛或条形将由一个代表<rect> element

我们可以使用上升和下降颜色将条形与其他条形分开<rect>图表中的元素

数据表中的条数与行数相同

一旦我们找到第一个柱,我们就可以使用rowIndex零从数据中提取值

我们需要找到上升/下降的值,以知道在哪里放置注释

然后使用图表方法找到注释的位置

getChartLayoutInterface()- 返回一个对象,其中包含有关图表及其元素在屏幕上的位置的信息。

getYLocation(position, optional_axis_index)- 返回相对于图表容器的屏幕位置 y 坐标。

请参阅以下工作片段
添加了两个注释
一是上升和下降的差异
另一个为具有注释角色的列中的值

google.charts.load('current', {
  callback: drawChart,
  packages: ['corechart']
});

function drawChart() {
  var chartPoints = [
    ['Budget', 0, 0, 9999, 9999, 'foo1'],
    ['Sales', 0, 0, 123, 123, 'foo2'],
    ['Backlog', 123, 123, 456, 456, 'foo3'],
    ['Hard Forecast', 456, 456, 789, 789, 'foo4'],
    ['Sales to Budget', 789, 789, 1000, 1000, 'foo5']
  ];
  var data = google.visualization.arrayToDataTable(chartPoints, true);
  data.setColumnProperty(5, 'role', 'annotation');
  var options = {
    legend: 'none',
    bar: { groupWidth: '40%', width: '100%' },
    candlestick: {
      fallingColor: { strokeWidth: 0, fill: '#a52714' },
      risingColor: { strokeWidth: 0, fill: '#0f9d58' }
    }
  };

  var container = document.getElementById('chart_div');
  var chart = new google.visualization.CandlestickChart(container);

  google.visualization.events.addListener(chart, 'ready', function () {
    var annotation;
    var bars;
    var chartLayout;
    var formatNumber;
    var positionY;
    var positionX;
    var rowBalance;
    var rowBottom;
    var rowIndex;
    var rowTop;
    var rowValue;
    var rowWidth;

    chartLayout = chart.getChartLayoutInterface();
    rowIndex = 0;
    formatNumber = new google.visualization.NumberFormat({
      pattern: '#,##0'
    });

    bars = container.getElementsByTagName('rect');
    for (var i = 0; i < bars.length; i++) {
      switch (bars[i].getAttribute('fill')) {
        case '#a52714':
        case '#0f9d58':
          rowWidth = parseFloat(bars[i].getAttribute('width'));
          if (rowWidth > 2) {
            rowBottom = data.getValue(rowIndex, 1);
            rowTop = data.getValue(rowIndex, 3);
            rowValue = rowTop - rowBottom;
            rowBalance = Math.max(rowBottom, rowTop);
            positionY = chartLayout.getYLocation(rowBalance) - 6;
            positionX = parseFloat(bars[i].getAttribute('x'));

            // row value
            annotation = container.getElementsByTagName('svg')[0].appendChild(container.getElementsByTagName('text')[0].cloneNode(true));
            annotation.textContent = formatNumber.formatValue(rowValue);
            annotation.setAttribute('x', (positionX + (rowWidth / 2)));
            annotation.setAttribute('y', positionY);
            annotation.setAttribute('font-weight', 'bold');

            // annotation column
            annotation = container.getElementsByTagName('svg')[0].appendChild(container.getElementsByTagName('text')[0].cloneNode(true));
            annotation.textContent = data.getValue(rowIndex, 5);
            annotation.setAttribute('x', (positionX + (rowWidth / 2)));
            annotation.setAttribute('y', positionY - 18);
            annotation.setAttribute('font-weight', 'bold');

            rowIndex++;
          }
          break;
      }
    }
  });

  chart.draw(data, options);
}
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向 Google 蜡烛图添加注释(发布的解决方案会触发 TypeError) 的相关文章

随机推荐

  • 导入 csv 时,Pandas 无法识别一列浮点数

    我正在尝试将国际货币基金组织的统计数据读入 pandas 数据框 import pandas as pd df pd read table http www imf org external pubs ft weo 2013 02 weod
  • php mail() 函数导致 404 文件未找到页面

    我有一个带有 html 表单的简单 php 页面 它的设置是让您填写表格并自动向我的电子邮件发送电子邮件 我没有收到任何电子邮件 并且页面重定向到 找不到文件 404 错误 而不是发生这种情况 这是 PHP
  • Knockout js:如何一次获取所有属性的通知

    假设我有一个包含 100 个 props 的 ViewModel 目前 我需要一个处理程序 如果任何道具发生变化 就会调用该处理程序 当然 我可以为每个属性编写 100 subscribe 但似乎有更好的方法 就像在 C 中一样 您可以绑定
  • 在 Windows 上为 Python 2.7 构建 lxml

    我正在尝试在 Windows 64 位计算机上为 Python 2 7 构建 lxml 我找不到 Python 2 7 版本的 lxml Egg 所以我从源头编译它 我正在按照该网站上的说明进行操作 http lxml de build h
  • 使用 Selenium 通过 MacOS 窗口上传图像

    Set up 我正在使用 Python 3 x 和 Selenium 在网上商店的后端工作 我需要从我的电脑上传产品图片到平台后端 Problem 使用 Selenium 可以单击图像上传按钮 但是单击会弹出 MacOS 文件选择器 Sel
  • Python,无法将 input() 转换为 int()

    我正在尝试使用以下代码将 input 数据转换为 int prompt text Enter a number try user num int input prompt text except ValueError print Error
  • 输出显示在 Jupyter Notebook 中,但未显示在 PyCharm 中

    我看过类似的帖子 但没有看到任何真正解决 Jupyter Notebook 和 PyCharm 之间输出差异的回复 一个例子是这样的 from datetime import datetime now datetime now now Ou
  • 为什么 text-decoration: none 在 p 中不起作用?

    我有以下 HTML 和 CSS 片段 我想要 不要强调 但确实如此 我究竟做错了什么 p color red text decoration underline font size 1 2em span none text decorati
  • 使用 Parcelable 在 Intent 中传递数组

    我想在活动之间发送一系列对象 我想使用 Parcelable 接口并以意图发送数据 但是我不断收到错误 我已经被困了2天了 以下是有关我的问题的一些详细信息 Class A private ProjetUI mProjects privat
  • 如何从数据表填充列表视图

    我有一个ListView and a DataTable我想知道如何填充ListView来自DataTable 这是我的代码 DataTable dt new DataTable SqlConnection conn new SqlConn
  • 尝试在 Android 1.5 上使用 Base64 时出现“IllegalArgumentException: bad base-64”[已关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 I get java lang IllegalArgumentException bad
  • WPF ItemsControl ItemTemplate 边框与 GroupStyle

    这是我第一次发图片 所以希望效果很好 一张图片抵一千字 我不想打一千字 但是 下图是我想要实现的目标 我有一个需要按属性 组 分组的对象集合 我正在使用绑定到为我进行分组的数据源的 CollectionViewSource 我正在使用 It
  • Javascript函数不修改数组(参考?)

    如果 JavaScript 将函数参数作为原始对象的引用传递 为什么我不能使用这个简单的函数修改原始数组 var array1 one function change array var array2 222 array array2 ch
  • ADB 拒绝 shell 命令 (ls -l /data)

    我不断得到 ADB rejected shell command ls l data 以及运行时的命令提示符adb shell告诉我error device not found虽然模拟器是打开的 我做错了什么 我假设您从命令行运行 adb
  • 如何从unix中的给定日期获取上周日日期

    获取上周日日期作为给定日期 不是当前日期 作为输入的输出 输入示例 2017 年 8 月 30 日 m d Y 输出应该是上周日 08 27 2017 以下所有命令都使用当天作为参考 但我想将参考日期作为输入以获取上周日 请帮我执行命令 日
  • Scaffold-DbContext“登录失败”“错误号:4060,状态:1,类别:11”

    我的 ASP NET MVC 核心应用程序应通过实体框架连接到现有的 MSSQL LocalDB 文件 数据库优先开发需要对现有数据库进行逆向工程 按照中的说明进行操作官方文档 我在 NuGet 包管理器控制台中运行以下命令 Scaffol
  • R:无效的多字节字符串[重复]

    这个问题在这里已经有答案了 我使用不带任何参数的 read delim filename 来读取 R 中制表符分隔的文本文件 df read delim file 这按预期进行 现在我有一个奇怪的错误消息 我无法理解它 Error in t
  • 检测后退按钮但不关闭对话框片段

    我有一个浮动对话框的对话框片段 其中包括一个特殊的键盘 当用户在 EditText 字段内按下时会弹出该键盘 正常的 IME 停止显示 我希望当用户按下后退按钮 就像普通的 IME 服务一样 时键盘被关闭 可见性 GONE 但对话框保持可见
  • 为什么我收到手势识别器不能在原型对象上使用的信息?

    当我将 UITapGestureRecognizer 放入场景中 UITableViewCell 内的 UIView 内时 我从情节提要中收到上述错误 知道为什么我会收到此错误吗 我不确定为什么会出现这种限制 但我知道为什么您会收到错误消息
  • 向 Google 蜡烛图添加注释(发布的解决方案会触发 TypeError)

    我正在尝试向 Google Candlestick 图表添加一些注释 我注意到有人已经问过同样的问题 向 Google 烛台图表添加注释 用户Aper u回复了详细的解决方案来扩展图表并添加注释 因为图表没有内置任何此类功能 但是 当我尝试