代码之家  ›  专栏  ›  技术社区  ›  mukesh.kumar

高阶图中堆积柱形图的重叠和舍入叠加

  •  3
  • mukesh.kumar  · 技术社区  · 6 年前

    我正在努力实现类似Column2014这样的目标,但我还没有找到一种方法来提供这样的分层效果。 This 是我现在所拥有的东西的一把小提琴。
    2 columns having different stacks

    我需要做一个堆积的柱状图 2014专栏或2015专栏 (这是可行的)

    • 列2014的问题是,我无法找到任何属性来提供(负)利润,以实现上述结果。

    • 列2015的问题是,我无法将边框半径单独添加到左上角和右上角。

    Highcharts.chart('container', {
      chart: {
        type: 'column',
        spacingBottom: 0
      },
      title: {
        text: ''
      },
      xAxis: {
        categories: ['Apples', 'Oranges', 'Pears', 'Grapes', 'Bananas'],
        offset: 7,
        lineWidth: 0,
        tickLength: 0
      },
      yAxis: {
        min: 0,
        title: {
          text: ''
        },
        stackLabels: {
          enabled: false,
          style: {
            fontWeight: 'bold',
            color: 'gray'
          }
        },
        visible: false
      },
      legend: {
        align: 'center',
    
        verticalAlign: 'bottom',
    
      },
      tooltip: {
        headerFormat: '<b>{point.x}</b><br/>',
        pointFormat: '{series.name}: {point.y}<br/>Total: {point.stackTotal}'
      },
      plotOptions: {
        series: {
    
        },
        column: {
          stacking: 'normal',
          borderWidth: 0,
          borderRadius: 5,
          dataLabels: {
            enabled: true,
            color: 'white'
          }
        }
      },
      series: [{
        name: 'John',
        data: [5, 3, 4, 7, 2],
    
      }, {
        name: 'Jane',
        data: [2, 2, 3, 2, 1]
      }, {
        name: 'Joe',
        data: [3, 4, 4, 2, 5]
      }]
    });
    <script src="https://code.highcharts.com/highcharts.js"></script>
    <script src="https://code.highcharts.com/modules/exporting.js"></script>
    <script src="https://code.highcharts.com/modules/export-data.js"></script>
    
    <div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>
    2 回复  |  直到 6 年前
        1
  •  2
  •   ewolden    6 年前

    实现你的目标 2014 结果,您可以使用 highchart wrapper ,并更改点的绘制方式,如下所示:

    (function (H) {
      H.wrap(H.seriesTypes.column.prototype, 'drawPoints', function (proceed) {
        $.each(this.points, function (i,point) {
          let borderRadius = this.options.borderRadius;
          point.shapeArgs.y -=  borderRadius; //move the point down by borderRadius pixels
          point.shapeArgs.height +=  borderRadius; //add borderRadius pixels to the total height of a point (to cover the gap)
        });
        proceed.apply(this, Array.prototype.slice.call(arguments, 1));
      });
    }(Highcharts));
    

        (function (H) {
          H.wrap(H.seriesTypes.column.prototype, 'drawPoints', function (proceed) {
            let seriesIndex = this.index
            $.each(this.points, function (i,point) {
            	point.shapeArgs.y -= seriesIndex == 0 ? 0 : 5; //if it is not the first series, then move the series down 5 pixels
                point.shapeArgs.height +=  5; //add 5 pixels to the total height(to cover the gap)
              });
              proceed.apply(this, Array.prototype.slice.call(arguments, 1));
            });
        }(Highcharts));
    
    Highcharts.chart('container', {
      chart: {
        type: 'column',
        spacingBottom: 0
      },
      title: {
        text: ''
      },
      xAxis: {
        categories: ['Apples', 'Oranges', 'Pears', 'Grapes', 'Bananas'],
        offset: 7,
        lineWidth: 0,
        tickLength: 0
      },
      yAxis: {
        min: 0,
        title: {
          text: ''
        },
        stackLabels: {
          enabled: false,
          style: {
            fontWeight: 'bold',
            color: 'gray'
          }
        },
        visible: false
      },
      legend: {
        align: 'center',
    
        verticalAlign: 'bottom',
    
      },
      tooltip: {
        headerFormat: '<b>{point.x}</b><br/>',
        pointFormat: '{series.name}: {point.y}<br/>Total: {point.stackTotal}'
      },
      plotOptions: {
        series: {
    
        },
        column: {
          stacking: 'normal',
          borderWidth: 0,
          borderRadius: 5,
          dataLabels: {
            enabled: true,
            color: 'white'
          }
        }
      },
      series: [{
        name: 'John',
        data: [5, 3, 4, 7, 2],
    
      }, {
        name: 'Jane',
        data: [2, 2, 3, 2, 1]
      }, {
        name: 'Joe',
        data: [3, 4, 4, 2, 5]
      }]
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://code.highcharts.com/highcharts.js"></script>
    <script src="https://code.highcharts.com/modules/exporting.js"></script>
    <script src="https://code.highcharts.com/modules/export-data.js"></script>
    
    <div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>

    https://jsfiddle.net/ewolden/cyfv64ub/122/

    如果你想要 结果相反,使用相同的函数,如下所示:

    (function(H) {
      H.wrap(H.seriesTypes.column.prototype, 'drawPoints', function(proceed) {
        let seriesIndex = this.index,
          firstIndex = this.chart.series[0].index,
          lastIndex = this.chart.series[this.chart.series.length - 1].index,
          borderRadius = this.options.borderRadius;
    
        this.options.borderRadius = 0; //Remove the border radius
    
        $.each(this.points, function(i, point) {
          if (seriesIndex != firstIndex && seriesIndex != lastIndex) {
            point.shapeArgs.y -= borderRadius; //make sure the middle points cover the outer points
            point.shapeArgs.height += borderRadius*2; 
          }
        });
    
        proceed.apply(this, Array.prototype.slice.call(arguments, 1));
    
        $.each(this.points, function(i, point) {
          if (seriesIndex == firstIndex || seriesIndex == lastIndex) {
            point.graphic.attr({
              r: borderRadius //set the borer radius to be whatever it was before to only the outer points
            });
          }
        });
      });
    }(Highcharts));
    

    我手动设置系列的zIndex,但也可以这样做。只是现在没时间找地方放。

    (function(H) {
      H.wrap(H.seriesTypes.column.prototype, 'drawPoints', function(proceed) {
        let seriesIndex = this.index,
          firstIndex = this.chart.series[0].index,
          lastIndex = this.chart.series[this.chart.series.length - 1].index,
          borderRadius = this.options.borderRadius;
    
        this.options.borderRadius = 0; //Remove the border radius
    
        $.each(this.points, function(i, point) {
          if (seriesIndex != firstIndex && seriesIndex != lastIndex) {
            point.shapeArgs.y -= borderRadius; //make sure the middle points cover the outer points
            point.shapeArgs.height += borderRadius*2; 
          }
        });
    
        proceed.apply(this, Array.prototype.slice.call(arguments, 1));
    
        $.each(this.points, function(i, point) {
          if (seriesIndex == firstIndex || seriesIndex == lastIndex) {
            point.graphic.attr({
              r: borderRadius //set the borer radius to be whatever it was before to only the outer points
            });
          }
        });
      });
    }(Highcharts));
    
    Highcharts.chart('container', {
      chart: {
        type: 'column',
        spacingBottom: 0
      },
      title: {
        text: ''
      },
      xAxis: {
        categories: ['Apples', 'Oranges', 'Pears', 'Grapes', 'Bananas'],
        offset: 7,
        lineWidth: 0,
        tickLength: 0
      },
      yAxis: {
        min: 0,
        title: {
          text: ''
        },
        stackLabels: {
          enabled: false,
          style: {
            fontWeight: 'bold',
            color: 'gray'
          }
        },
        visible: false
      },
      legend: {
        align: 'center',
    
        verticalAlign: 'bottom',
    
      },
      tooltip: {
        headerFormat: '<b>{point.x}</b><br/>',
        pointFormat: '{series.name}: {point.y}<br/>Total: {point.stackTotal}'
      },
      plotOptions: {
        series: {
    
        },
        column: {
          stacking: 'normal',
          borderWidth: 0,
          borderRadius: 5,
          dataLabels: {
            enabled: true,
            color: 'white'
          }
        }
      },
      series: [{
        name: 'John',
        data: [5, 3, 4, 7, 2],
        zIndex: 0
      }, {
        name: 'Jane',
        data: [2, 2, 3, 2, 1],
        zIndex: 1
      }, {
        name: 'Joe',
        data: [3, 4, 4, 2, 5],
        zIndex: 0
      }]
    });
    <脚本src=“https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js“></script>
    <脚本src=“https://code.highcharts.com/highcharts.js“></script>
    <脚本src=“https://code.highcharts.com/modules/exporting.js“></script>
    <脚本src=“https://code.highcharts.com/modules/export-data.js“></script>
    
    <div id=“container”style=“最小宽度:310px;高度:400px;边距:0自动”></div>

    工作中间: https://jsfiddle.net/ewolden/kqrLs3m8/

    drawPoints 在这里,正如docs所述,它只在开始时运行一次。因此,如果您开始禁用/启用序列,那么它们就不一定像您期望的那样。

        2
  •  0
  •   raf18seb    6 年前

    为了达到2015年的效果,你可以使用 四舍五入-角落.js 插件: https://rawgit.com/highcharts/rounded-corners/master/rounded-corners.js

    series: [{
      data: [307, 231, 335, 203],
      borderRadiusTopLeft: '20px',
      borderRadiusTopRight: '20px'
    }, {
      data: [183, 196, 547, 408]
    }, {
      data: [414, 441, 514, 627],
      borderRadiusBottomLeft: '20px',
      borderRadiusBottomRight: '20px'
    }]
    

    J中间: https://jsfiddle.net/BlackLabel/tdp1y0wb