使Highcharts看起来像有多个系列的进度条

时间:2017-11-05 23:01:41

标签: javascript jquery css highcharts bar-chart

我一直在尝试修改highcharts栏的外观,我设法使水平条形图看起来像进度条形图。为了做到这一点,我在SO中遵循了这个answer。现在,我遇到两个问题。如果我有一个数据系列,那么图表看起来很好但是如果我有多个系列(最多可以有3个系列),它的外观如下。

enter image description here

因此,我想增加标签之间的差距(美国,日本等)。其次,我想将数据标签(10,40,20等)对准图表右侧的条形图。我想我需要写一些javascript,但我不知道从哪里开始或修改什么。任何帮助表示赞赏。 感谢。

var chart = new Highcharts.Chart({
chart: {
  renderTo: 'container',
  type: 'bar',
  backgroundColor: '#003755',
  marginBottom: 60,
  marginLeft: 80,
  marginTop: 40,
  marginRight: 140
  },
  colors: ['#0AA3DB', '#3AC6B1', '#000612'],
  xAxis: [{
    categories: ['USA', 'Japan', 'Canada', 'Brasil', 'China', 'Russia', 'UK', 'France', 'NA'],
    labels: {
      align: 'left',
      x: 0,
      y: -13,/* to be adjusted according to number of bars*/
      style: {
        fontSize: "0.875rem",
        color: '#fff'
      }
    },
    lineColor: 'transparent',
    tickLength: 0
  }],
  yAxis: {
    lineWidth: 0,
    gridLineWidth: 0,
    labels: {
      enabled: false
    }
  },
  plotOptions: {
    bar: {
      dataLabels: {
        allowOverlap: true,
        color: (Highcharts.theme && Highcharts.theme.dataLabelsColor) || 'white'
      }
    },
    series: {
      pointWidth: 8, //width of the column bars irrespective of the chart size
      borderRadius: 5,
      borderColor: 'transparent',
      pointPadding: 0,
      groupPadding: 0,
      dataLabels: {
        enabled: true,
        format: '<b>{point.y:,.0f}</b>',
        shared: true,
        useHTML: true,
        align: 'right'
      }
    }
  },
  exporting: {
    enabled: false
  },

  credits: {
    enabled: false
  },
  tooltip: {
    yDecimals: 2
  },
  tooltip: {
    headerFormat: '<span style="font-size:11px">{series.name}</span><br>',
    pointFormat: '<b>{point.name} - {point.y:,.0f}%</b>',
    shared: true,
    useHTML: true
  },
  series: [{
    name: 'Current',
    type: 'bar',
    data: [{
      name: 'USA',
      y: 10
    }, {
      name: 'Japan',
      y: 40
    }, {
      name: 'Canada',
      y: 20
    }, {
      name: 'Brasil',
      y: 5
    }, {
      name: 'China',
      y: 9
    }, {
      name: 'Russia',
      y: 8
    }, {
      name: 'UK',
      y: 7
    }, {
      name: 'France',
      y: 1
    }, {
      name: 'NA',
      y: 0
    }]
  }, {
    name: '2005',
    type: 'bar',
    data: [{
      name: 'USA',
      y: 10
    }, {
      name: 'Japan',
      y: 40
    }, {
      name: 'Canada',
      y: 20
    }, {
      name: 'Brasil',
      y: 5
    }, {
      name: 'China',
      y: 9
    }, {
      name: 'Russia',
      y: 8
    }, {
      name: 'UK',
      y: 7
    }, {
      name: 'France',
      y: 1
    }, {
      name: 'NA',
      y: 0
    }]
  }, {
    name: '2023',
    type: 'bar',
    data: [{
      name: 'USA',
      y: 10
    }, {
      name: 'Japan',
      y: 40
    }, {
      name: 'Canada',
      y: 20
    }, {
      name: 'Brasil',
      y: 5
    }, {
      name: 'China',
      y: 9
    }, {
      name: 'Russia',
      y: 8
    }, {
      name: 'UK',
      y: 7
    }, {
      name: 'France',
      y: 1
    }, {
      name: 'NA',
      y: 0
    }]
  }]
});

https://jsfiddle.net/fbsveysb/

2 个答案:

答案 0 :(得分:1)

使用groupPadding增加列组之间的空间。

dataLabels.align的默认值为left(标签左侧的点) - 此值应用于将数据标签定位在条形图之外。

实时工作演示: https://jsfiddle.net/kkulig/w782cud7/

API参考:

答案 1 :(得分:0)

这可能是我在评论中提出的可能解决方案之一。它使用Scrollbars for any axis来显示如何在轴上滚动。它使用highstock.js文件,它可以应用于常规的Highcharts轴。

var chart = new Highcharts.Chart({
  chart: {
    renderTo: 'container',
    type: 'bar',
    backgroundColor: '#003755',
    marginBottom: 60,
    marginLeft: 80,
    marginTop: 40,
    marginRight: 140,
    events: {
      load: function() {
        var maxVal = 0;
        for (var i = 0; i < this.series.length; i++) {
          if (Math.max.apply(Math, this.series[i].yData) > maxVal) {
            maxVal = Math.max.apply(Math, this.series[i].yData)
          }
        }
        this.yAxis[0].setExtremes(0, maxVal + 10)
      }
    }
  },
  colors: ['#0AA3DB', '#3AC6B1', '#000612'],
  xAxis: [{
    categories: ['USA', 'Japan', 'Canada', 'Brasil', 'China', 'Russia', 'UK', 'France', 'NA'],
    labels: {
      align: 'left',
      x: 0,
      y: -20,
      /* to be adjusted according to number of bars*/
      style: {
        fontSize: "0.875rem",
        color: '#fff'
      }
    },
    lineColor: 'transparent',
    tickLength: 0,
    min: 0,
    max: 4,
    scrollbar: {
      enabled: true
    },
  }],
  yAxis: {
    lineWidth: 0,
    gridLineWidth: 0,
    labels: {
      enabled: false
    }
  },
  plotOptions: {
    bar: {
      grouping: true,
      pointPadding: 0,
      dataLabels: {
        allowOverlap: true,
        color: (Highcharts.theme && Highcharts.theme.dataLabelsColor) || 'white'
      }
    },
    series: {
      pointWidth: 8, //width of the column bars irrespective of the chart size
      borderRadius: 5,
      borderColor: 'transparent',
      dataLabels: {
        enabled: true,
        //format: '{point.y:.1f}',
        format: '<b>{point.y:,.0f}</b>',
        shared: true,
        useHTML: true,
        overflow: 'none'
      }
    }
  },
  exporting: {
    enabled: false
  },

  credits: {
    enabled: false
  },
  tooltip: {
    yDecimals: 2
  },
  tooltip: {
    headerFormat: '<span style="font-size:11px">{series.name}</span><br>',
    pointFormat: '<b>{point.name} - {point.y:,.0f}%</b>',
    shared: true,
    useHTML: true
  },
  series: [{
    name: 'Current',
    type: 'bar',
    data: [{
      name: 'USA',
      y: 10
    }, {
      name: 'Japan',
      y: 40
    }, {
      name: 'Canada',
      y: 20
    }, {
      name: 'Brasil',
      y: 5
    }, {
      name: 'China',
      y: 9
    }, {
      name: 'Russia',
      y: 8
    }, {
      name: 'UK',
      y: 7
    }, {
      name: 'France',
      y: 1
    }, {
      name: 'NA',
      y: 0
    }]
  }, {
    name: '2005',
    type: 'bar',
    data: [{
      name: 'USA',
      y: 10
    }, {
      name: 'Japan',
      y: 40
    }, {
      name: 'Canada',
      y: 20
    }, {
      name: 'Brasil',
      y: 5
    }, {
      name: 'China',
      y: 9
    }, {
      name: 'Russia',
      y: 8
    }, {
      name: 'UK',
      y: 7
    }, {
      name: 'France',
      y: 1
    }, {
      name: 'NA',
      y: 0
    }]
  }, {
    name: '2023',
    type: 'bar',
    data: [{
      name: 'USA',
      y: 10
    }, {
      name: 'Japan',
      y: 40
    }, {
      name: 'Canada',
      y: 20
    }, {
      name: 'Brasil',
      y: 5
    }, {
      name: 'China',
      y: 9
    }, {
      name: 'Russia',
      y: 8
    }, {
      name: 'UK',
      y: 7
    }, {
      name: 'France',
      y: 1
    }, {
      name: 'NA',
      y: 0
    }]
  }]
});
<script src="https://code.highcharts.com/stock/highstock.js"></script>
<div id="container"></div>