【问题标题】:How to redraw SVG Rendered Text from Highcharts如何从 Highcharts 重绘 SVG 渲染文本
【发布时间】:2019-09-30 03:30:54
【问题描述】:

单击其中一个图例后如何重绘 SVG 渲染文本?我遇到的问题是,SVG 留在原地。
如果我点击其中一个图例,就会发生这种情况

我用来制作这个图表的方法是:

  1. 创建一些空数组。
  2. 比较每个系列的值,找出哪个系列的值最高
  3. 将最大值的 xAxis 推到数组中。
  4. 在该系列的最高值旁边呈现 SVG 文本

这是我的代码示例:

       events: {
        render: function() {
          const chart = this,
            xAxis = chart.xAxis[0],
            yAxis = chart.yAxis[0],
            offsetX = 5;

          let customElems = chart.customElems || [],
            y,
            x,
            element;

          if (customElems.length) {
            customElems.forEach(elem => {
              elem.destroy();
            });

            customElems.length = 0;
          }

          var series_s_y = [];
          var series_d_y = [];
          var series_x   = [];
          var p          = [];
          chart.series[0].points.forEach((point, i) => {
            x = yAxis.toPixels(point.y) + 10;
            y = xAxis.toPixels(point.x);
            series_s_y.push(x);
            series_x.push(y);
          });

          chart.series[1].points.forEach((point, i) => {
            x = yAxis.toPixels(point.y) + 10;
            y = xAxis.toPixels(point.x);
            series_d_y.push(x);
          });
          for(i = 0;i < series_s_y.length; i++) {

            if(series_d_y[i] > series_s_y[i]) {
              p.push(series_d_y[i]);
            }
            else {
              p.push(series_s_y[i]);
            } 
            element = chart.renderer.text(`${PERSEN[i].toFixed(2)} %`, p[i], series_x[i]).attr({
              "fill": '#000',
              "font-weight": "bold",
              "class": "svg"
            }).add().toFront();

            customElems.push(element);
          }
          chart.customElems = customElems;
        }
      }

这是我的完整代码:
https://jsfiddle.net/d70ea4pq/
任何形式的帮助都非常感谢,非常感谢您

【问题讨论】:

    标签: javascript svg highcharts


    【解决方案1】:

    文本元素被重绘,但隐藏系列的值也被比较。您可以在创建数组之前检查该系列是否可见:

    for (i = 0; i < chart.series[0].points.length; i++) {
    
        if (series_d_y.length && series_s_y.length) {
            if (series_d_y[i] > series_s_y[i]) {
                p.push(series_d_y[i]);
            } else {
                p.push(series_s_y[i]);
            }
        } else if (series_d_y.length) {
            p.push(series_d_y[i]);
        } else if (series_s_y.length) {
            p.push(series_s_y[i]);
        }
    
        element = chart.renderer.text(
            `${PERSEN[i].toFixed(2)} %`,
            p[i],
            series_x[i]
        ).attr({
            "fill": '#000',
            "font-weight": "bold",
            "class": "svg"
        }).add().toFront();
    
        customElems.push(element);
    }
    

    现场演示: https://jsfiddle.net/BlackLabel/59gLzbpt/

    API 参考: https://api.highcharts.com/highcharts/chart.events.render

    【讨论】:

    • 谢谢,效果很好。我试图在 legendItemClick 上放置一些处理程序,但它不起作用。这很好用
    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2020-11-23
    • 2011-01-20
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多