HighCharts 自定义 SVG 标记符号

3
根据Highcharts文档,您可以通过为(SVG基础的)符号路径定义自定义回调函数来创建自己的点标记。
但是,如果您需要从符号原型函数中访问底层系列数据,是否可能?
例如:

Highcharts.SVGRenderer.prototype.symbols.cross = function (x, y, w, h) {

    // I want to be able to access the series data from here. 
    // Either the point data or the entire series' data array.
           
    return ['M', x, y, 'L', x + w, y + h, 'M', x + w, y, 'L', x, y + h, 'z'];
};

if (Highcharts.VMLRenderer) {
    Highcharts.VMLRenderer.prototype.symbols.cross = Highcharts.SVGRenderer.prototype.symbols.cross;
}


Highcharts.chart('container', {

    title: {
        text: 'Demo of predefined, image and custom marker symbols'
    },

    legend: {
        y: -40 // make room for subtitle
    },

    xAxis: {
        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    },

    series: [{
        name: 'Custom symbol',
        data: [54.4, 29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6],
        marker: {
            symbol: 'cross',
            lineColor: null,
            lineWidth: 2
        }
    }],

    credits: {
        enabled: false
    },

    subtitle: {
        text: '*) Base64 not supported in IE6 and IE7',
        verticalAlign: 'bottom',
        align: 'right',
        y: null,
        style: {
            fontSize: '10px'
        }
    }
});
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<div id="container" style="height: 400px; max-width: 800px; margin: 0 auto"></div>


我不认为那是可能的... 你能解释一下为什么你需要那个吗?也许有另一种实现你想要的东西的方式。 - João Menighin
为什么不将数据存储为全局数组,这样您就可以在任何地方访问它们。 - Hikarunomemory
你能详细说明一下你的问题是什么,并且最终结果应该是什么吗? - morganfree
1个回答

3
原来,您实际上可以在单个点级别上定义标记属性。从那里,您可以提供值并使其从自定义回调中访问。
像这样:

Highcharts.SVGRenderer.prototype.symbols.cross = function(x, y, w, h, d) {

  // I want to be able to access the series data from here. 
  // Either the point data or the entire series' data array.
  if (d.v) {
    console.debug("Point-specific data: " + d.v);
  }

  // From here, you can imagine one can use the point-specific data to affect the symbol path. 
  // A good example would be to in case you want to build a series of custom wind barbs, 
  // in which the path of the barb will be based on the intensity and direction of each point 
  // ...

  return ['M', x, y, 'L', x + w, y + h, 'M', x + w, y, 'L', x, y + h, 'z'];
};

if (Highcharts.VMLRenderer) {
  Highcharts.VMLRenderer.prototype.symbols.cross = Highcharts.SVGRenderer.prototype.symbols.cross;
}


Highcharts.chart('container', {

  title: {
    text: 'Demo of predefined, image and custom marker symbols'
  },

  xAxis: {
    type: 'datetime'
  },

  series: [{
    name: 'Custom symbol',
    data: [{
        x: 1525089600000,
        y: 54.4,
        marker: {
          symbol: "cross",
          v: 54.4
        }
      },

      {
        x: 1525090500000,
        y: 71.5,
        marker: {
          symbol: "cross",
          v: 71.5
        }
      },

      {
        x: 1525091400000,
        y: 29.9,
        marker: {
          symbol: "cross",
          v: 29.9
        }
      }

    ],
    marker: {
      symbol: 'cross',
      lineColor: null,
      lineWidth: 2
    }
  }],


});
<script src="https://code.highcharts.com/highcharts.js"></script>
<div id="container" style="height: 400px"></div>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接