在Highcharts中的柱形图中更改绘图线上方和下方的图形颜色

时间:2017-12-11 07:35:35

标签: charts highcharts threshold column-chart

我有一个带有两个绘图线的图形。我需要在穿过每个绘图线后用不同颜色对列部分着色。但是区域使不同的列具有不同的颜色,而不是上面的单独部分。我试过Zones&门槛但没有获得柱形图的任何解决方案。

有折线图的解决方案,但它们不适用于柱形图。

Highcharts.chart('container', {
                    chart: {
                        zoomType: 'xy',
                        events: {
                            load: function () {
                                this.myTooltip = new Highcharts.Tooltip(this, this.options.tooltip);
                            }
                        }
                    },
                    title: {
                        text: ''
                    },
                    credits: {
                        enabled: false
                    },
                    subtitle: {
                        text: ''
                    },
                    useUTC: false,
                    xAxis: [{
                        type: 'datetime',
                        dateTimeLabelFormats: {
                            day: '%e %b',
                            hour: '%I:%M %P'
                        }

                    }],
                    yAxis: [{ // Primary yAxis
                        labels: {
                            format: '{value:,.0f}',
                            style: {
                                color: Highcharts.getOptions().colors[1]
                            }
                        },
                        plotLines: [peakPlotLineOption, averagePlotLineOption],
                        title: {
                            text: 'Consumption (kWh)',
                            style: {
                                color: Highcharts.getOptions().colors[1]
                            }
                        }}

                    , { // Secondary yAxis
                        title: {
                            text: '',
                            style: {
                                color: Highcharts.getOptions().colors[0]
                            }
                        },
                        labels: {
                            format: '{value} kWh',
                            style: {
                                color: Highcharts.getOptions().colors[0]
                            }
                        },
                        visible: false
                    }],

        tooltip: { 
            crosshairs: true,
            shared: true,
            valueSuffix: '°C'
        },
                    series: [{
                        name: 'ABC',
                        type: 'column',
                        data: 

                         [
                         { x: Date.UTC(2017, 6, 2, 0), y: 49.9,  bId: 1 },
                         { x: Date.UTC(2017, 6, 2, 1), y: 71.5,  bId: 2 },
                         { x: Date.UTC(2017, 6, 2, 2), y: 106.4,  bId: 3 },
                         { x: Date.UTC(2017, 6, 2, 3), y: 129.2,  bId: 4 },
                         { x: Date.UTC(2017, 6, 2, 4), y: 144.0,  bId: 5 },
                         { x: Date.UTC(2017, 6, 2, 5), y: 176.0,  bId: 6 },
                         { x: Date.UTC(2017, 6, 2, 6), y: 135.6, bId: 7 },
                         { x: Date.UTC(2017, 6, 2, 7), y: 148.5,  bId: 8 },
                         { x: Date.UTC(2017, 6, 2, 8), y: 216.4,  bId: 9 },
                         { x: Date.UTC(2017, 6, 2, 9), y: 194.1,  bId: 10 },
                         { x: Date.UTC(2017, 6, 2, 10), y: 95.6,  bId: 11 },
                         { x: Date.UTC(2017, 6, 2, 11), y: 54.4,  bId: 12 },
                         { x: Date.UTC(2017, 6, 2, 12), y: 45, bId: 13 },
                         { x: Date.UTC(2017, 6, 2, 13), y: 62,  bId: 14 },
                         { x: Date.UTC(2017, 6, 2, 14), y: 35,  bId: 15 }
                         ], 
                        tooltip: {
                            valueSuffix: ' kWh'
                        },
                        yAxis: 0,
                       zones: [{
                                value: 50,
                                color: '#90ed7d'
                              }, {
                                value: 100,
                                color: '#FFDE00'
                              },{
                                color: '#CE0000'
                              }]
                   }
                    , {
                        // Series that mimics the plot line
                        color: '#ee8176',
                        name: 'contract capacity',
                        dashStyle: 'Solid',
                        marker: {
                            enabled: false
                        },
                        events: {
                            legendItemClick: function (e) {
                                if (this.visible) {
                                    this.chart.yAxis[0].removePlotLine(averagePlotLine);
                                }
                                else {
                                    this.chart.yAxis[0].addPlotLine(averagePlotLineOption);
                                }
                            }
                        },
                        yAxis: 0
                    }, {
                        // Series that mimics the plot line
                        color: '#9fa7b1',
                        name: 'max demand',
                        dashStyle: 'Solid',
                        marker: {
                            enabled: false
                        },
                        events: {
                            legendItemClick: function (e) {
                                if (this.visible) {
                                    this.chart.yAxis[0].removePlotLine(peakPlotLine);
                                }
                                else {
                                    this.chart.yAxis[0].addPlotLine(peakPlotLineOption);
                                }
                            }
                        },
                        yAxis: 0
                    }               
                ]
                });

JsFiddle Colulmn chart

1 个答案:

答案 0 :(得分:0)

默认情况下,Highcharts不支持这种着色。

这里的

解决方法是使用stacking机制模拟区域并将一个点分成多个反映区域的点。每个系列都包含来自一个区域的点:

var zones = [{
  color: 'green',
  start: 0
}, {
  color: 'yellow',
  start: 30
}, {
  color: 'red',
  start: 80
}];

//(...)

function prepareSeries(series) {
  var newSeries = [],
    data = series.data;

  series.data = [];

  // create separate series for each zone
  zones.forEach(function(z, i) {
    newSeries.push({
      data: []
    }); // copy series properties
  });

  // create new points and add them to new series array
  data.forEach(function(p) {
    for (var i = 0; i < zones.length; i++) {
      var currentZone = zones[i],
        nextZone = zones[i + 1],
        zoneSeries = newSeries[i];

      zoneSeries.color = currentZone.color;

      if (nextZone && p.y > nextZone.start) {
        zoneSeries.data.push({
          x: p.x,
          y: nextZone.start - currentZone.start
        });
      } else if (p.y > currentZone.start) {
        zoneSeries.data.push({
          x: p.x,
          y: p.y - currentZone.start
        });
      }

    }
  });

  newSeries.reverse();

  // one legend for all created series
  for (var i = 1; i < newSeries.length; i++) {
    newSeries[i].linkedTo = ':previous';
  }

  return newSeries;
}

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

linkedTo导致所有系列都连接起来(只有一个图例项目)。 tooltip.shared: truetooltipFormater用于恢复工具提示的先前格式(总值而不是列出的所有系列)。