在highcharts中拆分显示图例

时间:2017-12-03 23:23:50

标签: javascript jquery highcharts

我有高图表的组合图表,有样条曲线,饼图和堆叠。是否可以拆分图例或一起使用垂直和水平布局?

当前布局图例是水平的

*系列1 *系列2 *系列3 *系列4 *系列5 *系列6 *系列7 *系列8

我希望图例显示为

*系列1 *系列2
*系列3 *系列4 *系列5
*系列6 *系列7 *系列8

有可能吗?

感谢名单

2 个答案:

答案 0 :(得分:1)

您可以使用图例的itemWidth属性。这是链接

Highcharts.chart('container', {
chart: {
    width: 500
},

title: {
    text: 'Legend <em>itemWidth</em> option'
},

legend: {
    itemWidth: 100
},

series: [{
    data: [6, 4, 2],
    name: 'First'
}, {
    data: [7, 3, 2],
    name: 'Second'
}, {
    data: [9, 4, 8],
    name: 'Third'
}, {
    data: [1, 2, 6],
    name: 'Fourth'
}, {
    data: [4, 6, 4],
    name: 'Fifth'
}, {
    data: [1, 2, 7],
    name: 'Sixth'
}, {
    data: [4, 2, 5],
    name: 'Seventh'
}, {
    data: [8, 3, 2],
    name: 'Eighth'
}, {
    data: [4, 5, 6],
    name: 'Ninth'
}]

});

http://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/legend/itemwidth-80/

答案 1 :(得分:1)

仅使用Highcharts构造函数选项无法完成。您可以通过包装一些核心功能来实现这种外观和行为:

(function(H) {
  var merge = H.merge;

  H.wrap(H.Legend.prototype, 'getAllItems', function() {
    var allItems = [],
      chart = this.chart,
      options = this.options,
      legendID = options.legendID;

    H.each(chart.series, function(series) {
      if (series) {
        var seriesOptions = series.options;

        // use points or series for the legend item depending on legendType
        if (!isNaN(legendID) && (seriesOptions.legendID === legendID)) {
          allItems = allItems.concat(
            series.legendItems ||
            (seriesOptions.legendType === 'point' ?
              series.data :
              series)
          );
        }
      }
    });

    return allItems;
  });

  H.wrap(H.Chart.prototype, 'render', function(p) {
    var chart = this,
      chartOptions = chart.options;

    chart.firstLegend = new H.Legend(chart, merge(chartOptions.legend, chartOptions.firstLegend, {
      legendID: 0
    }));

    chart.secondLegend = new H.Legend(chart, merge(chartOptions.legend, chartOptions.secondLegend, {
      legendID: 1
    }));

    p.call(this);
  });

  H.wrap(H.Chart.prototype, 'redraw', function(p, r, a) {
    var chart = this;

    p.call(chart, r, a);

    chart.firstLegend.render();
    chart.secondLegend.render();
  });

  H.wrap(H.Legend.prototype, 'positionItem', function(p, item) {
    p.call(this, item);
  });
})(Highcharts);

Highcharts选项:

Highcharts.chart('container', {

  chart: {
    marginRight: 350 // create some space for the legend
  },

  legend: {
    verticalAlign: 'middle',
    width: 300,
    align: 'right'
  },
  firstLegend: {
    y: -25
  },
  secondLegend: {
    y: 25
  },

  series: [{
    data: [5, 6, 7],
    legendID: 0,
  }, {
    data: [2, 3, 1],
    legendID: 0,
  },
  (...)
  {
    data: [1, 8, 2],
    legendID: 1
  }, {
    data: [3, 2],
    legendID: 1
  },
  (...)
  ]
});

现场演示: http://jsfiddle.net/kkulig/r70fwasr/

此代码可以进行优化,以便适用于2个以上的图例。