Highcharts - график bar с группировкой

Мне нужно создать график bar с группировкой. Я сумел создать вот такой график:

// First, let's make the colors transparent
Highcharts.setOptions({
    colors: Highcharts.getOptions().colors.map(function (color) {
        return Highcharts.color(color)
            .setOpacity(0.5)
            .get('rgba');
    })
});

Highcharts.chart('container', {
    chart: {
        type: 'bar'
    },
    title: {
        text: 'Monthly Average Rainfall'
    },
    subtitle: {
        text: 'Source: WorldClimate.com'
    },
    xAxis: {
        categories: [
            'Jan',
            'Feb',
            'Mar',
            'Apr',
            'May',
            'Jun',
            'Jul',
            'Aug',
            'Sep',
            'Oct',
            'Nov',
            'Dec'
        ]
    },
    yAxis: {
        min: 0,
        title: {
            text: 'Rainfall (mm)'
        }
    },
    legend: {
        enabled: false,
        layout: 'vertical',
        backgroundColor: '#FFFFFF',
        align: 'left',
        verticalAlign: 'top',
        x: 100,
        y: 70,
        floating: true,
        shadow: true
    },
    tooltip: {
        shared: true,
        valueSuffix: ' mm'
    },
    plotOptions: {
        bar: {
            grouping: false,
            shadow: false
        }
    },
    series: [{
        name: 'Tokyo',
        data: [
            49.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1,
            95.6, 54.4
        ],
        pointPadding: 0

    }, {
        name: 'New York',
        data: [
            83.6, 78.8, 98.5, 93.4, 106.0, 84.5, 105.0, 104.3, 91.2, 83.5,
            106.6, 92.3
        ],
        pointPadding: 0.1

    }, {
        name: 'London',
        data: [
            48.9, 38.8, 39.3, 41.4, 47.0, 48.3, 59.0, 59.6, 52.4, 65.2, 59.3,
            51.2
        ],
        pointPadding: 0.2

    }, {
        name: 'Berlin',
        data: [
            42.4, 33.2, 34.5, 39.7, 52.6, 75.5, 57.4, 60.4, 47.6, 39.1, 46.8,
            51.1
        ],
        pointPadding: 0.3

    }]
});
#container {
    min-width: 400px;
    height: 400px;
    margin: 0 auto;
}
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>

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

введите сюда описание изображения

Однако мне нужно, чтобы для каждого месяца соответствовало несколько линий графика, как в этом примере: введите сюда описание изображения

Можно ли реализовать такое в highcharts?


Ответы (1 шт):

Автор решения: Ivan Shatsky

Вам надо настраивать параметры plotOptions.bar (поскольку у вас горизонтальная диаграмма; если бы она была вертикальная, настраивать надо было бы те же самые параметры plotOptions.column). В данном случае вам надо включить группировку значений в рамках одной категории plotOptions.bar.grouping (которая по умолчанию как раз включена, но в вашем примере она принудительно выключена установкой параметра plotOptions.bar.grouping: false). Ещё несколько опций, которые вы возможно захотите подкрутить - это plotOptions.bar.pointWidth (ширина полоски), plotOptions.bar.pointPadding (который сейчас у вас установлен индивидуально для каждой отдельной серии значений - это сделано как раз для того, чтобы линии "красиво" рисовались одна поверх другой), и plotOptions.bar.groupPadding, а так же сам размер диаграммы:

// First, let's make the colors transparent
Highcharts.setOptions({
    colors: Highcharts.getOptions().colors.map(function (color) {
        return Highcharts.color(color)
            .setOpacity(0.5)
            .get('rgba');
    })
});

Highcharts.chart('container', {
    chart: {
        type: 'bar'
    },
    title: {
        text: 'Monthly Average Rainfall'
    },
    subtitle: {
        text: 'Source: WorldClimate.com'
    },
    xAxis: {
        categories: [
            'Jan',
            'Feb',
            'Mar',
            'Apr',
            'May',
            'Jun',
            'Jul',
            'Aug',
            'Sep',
            'Oct',
            'Nov',
            'Dec'
        ]
    },
    yAxis: {
        min: 0,
        title: {
            text: 'Rainfall (mm)'
        }
    },
    legend: {
        enabled: false,
        layout: 'vertical',
        backgroundColor: '#FFFFFF',
        align: 'left',
        verticalAlign: 'top',
        x: 100,
        y: 70,
        floating: true,
        shadow: true
    },
    tooltip: {
        shared: true,
        valueSuffix: ' mm'
    },
    plotOptions: {
        bar: {
            pointWidth: 8,
            pointPadding: false,
            groupPadding: 0.1,
            shadow: false
        }
    },
    series: [{
        name: 'Tokyo',
        data: [
            49.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1,
            95.6, 54.4
        ]
    }, {
        name: 'New York',
        data: [
            83.6, 78.8, 98.5, 93.4, 106.0, 84.5, 105.0, 104.3, 91.2, 83.5,
            106.6, 92.3
        ]
    }, {
        name: 'London',
        data: [
            48.9, 38.8, 39.3, 41.4, 47.0, 48.3, 59.0, 59.6, 52.4, 65.2, 59.3,
            51.2
        ]
    }, {
        name: 'Berlin',
        data: [
            42.4, 33.2, 34.5, 39.7, 52.6, 75.5, 57.4, 60.4, 47.6, 39.1, 46.8,
            51.1
        ]
    }]
});
#container {
    min-width: 400px;
    height: 800px;
    margin: 0 auto;
}
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>

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

Результат:

result chart

→ Ссылка