I examined this subject and it seems that it's rather tricky thing to do in Highcharts.

The library uses SVGRenderer.label ( function for creating the data labels.

Chevron (small arrow) appears in callout shape label only when xAnchor and yAnchor are definded and necessary conditions from the Highcharts.Renderer.prototype.symbols.callout function are satisfied ( When data labels are generated for pie series these values are not defined - chevron doesn't appear.

You have overwritten this function and hardcoded the label path - that's not the solution when you want it to be responsive.

Here's a workaround that I found:

I set dataLabels.format to empty string - the label are generated, but they're not visible, because they have no content. I use their position in to generate new labels:

  render: function() {
    var chart = this,
      series = chart.series[0],
      renderer = chart.renderer;

    series.points.forEach(function(p) {
      var dl = p.dataLabel,
        x = dl.x + chart.plotLeft,
        y = dl.y + chart.plotTop,
        chartCenterX = chart.chartWidth / 2,
        chartCenterY = chart.chartHeight / 2,

      // destroy the old label
      if (dl.customLabel) {

      // definitions for all the directions
      if (x < chartCenterX && y < chartCenterY) { // right bottom corner chevron
        anchorX = x + 30;
        anchorY = y + 50;
      } // more should be added here

      // create custom label
      dl.customLabel = renderer.label(, x, y, 'callout', anchorX, anchorY).attr({
        fill: 'blue'
        color: 'white'


Live demo:

The biggest challenge here is to find a proper coordinates for anchors. I only did that for the label(s) in the top-left part of the plot area (it's just for example purposes - better formulas need to be found). I used the dimensions of the chart to compute these values.

It's not very elegant solution, but if you find proper formulas and do some coding it'll work.

Related Query

More Query from same tag