【问题标题】:SVG as labels in HighChart stacked column chartSVG 作为 HighChart 堆叠柱形图中的标签
【发布时间】:2021-10-27 15:45:23
【问题描述】:

我正在尝试在 highchart 中创建一个堆积柱形图,其中 x 轴标签是 SVG 图像,如下图所示:

我已经让它处理每个标签的单个数据点(即非堆叠数据),但是一旦我将输入数据更改为数组,数据就会停止呈现。 这“有效”: https://jsfiddle.net/jakobhl/krx4e5pm/2/

var dataName = function(imgSrc) {
  return '<span><img src=' + imgSrc + ' ' + 'style="width: 40px; height: 40px;"/><br></span>';
};

var data2016 = [
  [11, dataName("https://image.flaticon.com/icons/svg/197/197571.svg")],
  [11, dataName("https://image.flaticon.com/icons/svg/197/197408.svg")],
  [11, dataName("https://image.flaticon.com/icons/svg/197/197375.svg")],
  [14, dataName("https://image.flaticon.com/icons/svg/197/197374.svg")],
  [12, dataName("https://image.flaticon.com/icons/svg/197/197484.svg")],
];


Highcharts.chart('container', {
  chart: {
    type: 'column'
  },
    plotOptions: {
        column: {
            stacking: 'normal',
            dataLabels: {
                enabled: true
            }
        }
    },
  xAxis: {
    tickmarkPlacement: 'on',
    lineWidth: 0,
    type: 'category',
    labels: {
      useHTML: true,
      align: 'center'
    }
  },

  series: [{
    keys: ['y', 'name'],
    data: data2016,
  }]
});
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/highcharts-more.js"></script>

<div id="container"></div>

这不会: https://jsfiddle.net/jakobhl/2rfa645x/3/

var dataName = function(imgSrc) {
  return '<span><img src=' + imgSrc + ' ' + 'style="width: 40px; height: 40px;"/><br></span>';
};

var data2016 = [
  [[11, 15], dataName("https://image.flaticon.com/icons/svg/197/197571.svg")],
  [[12, 15], dataName("https://image.flaticon.com/icons/svg/197/197408.svg")],
  [[13, 15], dataName("https://image.flaticon.com/icons/svg/197/197375.svg")],
  [[41, 15], dataName("https://image.flaticon.com/icons/svg/197/197374.svg")],
  [[11, 15], dataName("https://image.flaticon.com/icons/svg/197/197484.svg")],
];


Highcharts.chart('container', {
  chart: {
    type: 'column'
  },
    plotOptions: {
        column: {
            stacking: 'normal',
            dataLabels: {
                enabled: true
            }
        }
    },
  xAxis: {
    tickmarkPlacement: 'on',
    lineWidth: 0,
    type: 'category',
    labels: {
      useHTML: true,
      align: 'center'
    }
  },

  series: [{
    keys: ['y', 'name'],
    data: data2016,
  }]
});
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/highcharts-more.js"></script>

<div id="container"></div>

如何在仍使用 SVG 作为标签的同时按国家/地区堆叠数据?

感谢 jsfiddle 用户 BlackLabel 的启发。

【问题讨论】:

    标签: javascript highcharts


    【解决方案1】:

    您可以添加另一个值,但您需要调整 Highcharts 所需的数据格式。如果新值为x,则如下:

    var data2016 = [
        [
            11, 15, dataName("https://image.flaticon.com/icons/svg/197/197571.svg")
        ],
        ...
    ];
    
    
    Highcharts.chart('container', {
        ...,
        series: [{
            keys: ['y', 'x', 'name'],
            data: data2016
        }]
    });
    

    现场演示: https://jsfiddle.net/BlackLabel/vubjn8od/

    API 参考: https://api.highcharts.com/highcharts/series.column.keys

    【讨论】:

    • 嗨@ppotaczek,很遗憾,这不太奏效,因为它将第一个国家(在这种情况下为美国)的所有数据分组。任何想法如何让所有国家/地区都显示其各自的数据?
    • 嗨@Jakob Handberg Lystbæk,我很抱歉,但我不确定你到底想达到什么目标。例如什么应该代表值[11, 15]?
    • [11,15] 应该产生一个值为 11 和 15 的堆叠列,总计 26。您的建议实现了这一点,但没有为每个县/svg 显示一列,而是将所有第一个国家/地区的值/ svg。我已经用我想要实现的图像更新了我的帖子。谢谢!
    【解决方案2】:

    我从来没有发现为什么原来的解决方案不起作用,但一个可行的解决方案是使用类别而不是系列: https://jsfiddle.net/jakobhl/L3hzeqpv/1/

    var dataName = function(imgSrc) {
      return '<span><img src=' + imgSrc + ' ' + 'style="width: 40px; height: 40px;"/><br></span>';
    };
    
    Highcharts.chart('container', {
        chart: {
            type: 'column'
        },
        title: {
            text: 'Stacked column chart'
        },
        xAxis: {
            labels: {
          useHTML: true,
          align: 'center'
        },
            categories: [dataName("https://image.flaticon.com/icons/svg/197/197571.svg"), dataName("https://image.flaticon.com/icons/svg/197/197408.svg"), dataName("https://image.flaticon.com/icons/svg/197/197375.svg"), dataName("https://image.flaticon.com/icons/svg/197/197374.svg"), dataName("https://image.flaticon.com/icons/svg/197/197484.svg")]
        },
        yAxis: {
            min: 0,
            title: {
                text: 'Total fruit consumption'
            },
            stackLabels: {
                enabled: true,
                style: {
                    fontWeight: 'bold',
                    color: ( // theme
                        Highcharts.defaultOptions.title.style &&
                        Highcharts.defaultOptions.title.style.color
                    ) || 'gray'
                }
            }
        },
        legend: {
            align: 'right',
            x: -30,
            verticalAlign: 'top',
            y: 25,
            floating: true,
            backgroundColor:
                Highcharts.defaultOptions.legend.backgroundColor || 'white',
            borderColor: '#CCC',
            borderWidth: 1,
            shadow: false
        },
        tooltip: {
            headerFormat: '<b>{point.x}</b><br/>',
            pointFormat: '{series.name}: {point.y}<br/>Total: {point.stackTotal}'
        },
        plotOptions: {
            column: {
                stacking: 'normal',
                dataLabels: {
                    enabled: true
                }
            }
        },
        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.jquery.com/jquery-3.2.1.min.js"></script>
    <script src="https://code.highcharts.com/highcharts.js"></script>
    <script src="https://code.highcharts.com/highcharts-more.js"></script>
    
    <div id="container"></div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多