Тепловая карта Highcharts — Как расположить блоки рядом друг с другом, если они разделены значением более 1

#javascript #jquery #highcharts #heatmap

Вопрос:

Прилагается изображение проблемы, с которой я в настоящее время сталкиваюсь.введите описание изображения здесь

Прилагается пример проблемы, созданной вручную с помощью JSFiddle

https://jsfiddle.net/ekjrLsz2/

Моя цель состоит в том, чтобы каждый из блоков был рядом друг с другом без всего промежутка между ними, как в демонстрациях по умолчанию для показа тепловой карты.

Я могу заставить его работать правильно, если данные идут 1 на 1, например; 1,2,3,4,5,6

Но если данные будут 5,10,15,20 и т. Д…. Тогда вы получите то, что видите на моем прикрепленном изображении.

Поэтому, чтобы быть более ясным, направление X на моем демонстрационном изображении 1 на 1 и отображается без интервалов, однако направление Y имеет большой интервал, поскольку в данных нет чисел 21,22,23,24 или, так сказать, промежутка между каждые 5.

Ниже приведен код, который я использую для создания диаграммы.

 Highcharts.setOptions({
                lang: {
                    decimalPoint: '.',
                    thousandsSep: ','
                }
            });

            Highcharts.chart('heatmap-container', {
    
                chart: {
                    type: 'heatmap',
                    marginTop: 40,
                    marginBottom: 80,
                    plotBorderWidth: 1
                },
            
            
                title: {
                    text: 'Report Data'
                },
            
                xAxis: {
                    //categories: ['1%', '2%', '3%', '4%', '5%', '6%', '7%', '8%', '9%', '10%'],
                    title: {text:$('#x-values').val()},
                    //showEmpty:true,
                },
            
                yAxis: {
                    categories: ['5', '10', '15', '20', '25'],
                    title: {text:$('#y-values').val()},
                    reversed: false,
                    //visible: true,
                    //showEmpty:true,
                },
            
                 colorAxis: {
                  max: goodColorVal,
                  min: badColorVal,
                  reversed: false,
                  tickInterval: 1,
                    //min: -150,
                    //minColor: '#FFFFFF',
                    //maxColor: '#00FF00',//Highcharts.getOptions().colors[4]
                    stops: [
                      [0.0,'#FF0000'],
                      [0.5,'#FFFFFF'],
                      [1.0,"#00FF00"]]
                }, 
                legend: {
                    align: 'right',
                    layout: 'vertical',
                    margin: 0,
                    verticalAlign: 'top',
                    y: 25,
                    symbolHeight: 280,
                    reversed:true
                },
                tooltip: {
                    headerFormat: '',
                    pointFormat: `<b style="text-transform:capitalize;">${$("#x-values option:selected").text()}</b>:{point.x:,.2f} - <b style="text-transform:capitalize;">${$("#y-values option:selected").text()}</b>:{point.y:,.2f} - <b style="text-transform:capitalize;">${$("#z-values option:selected").text()}</b>:{point.value:,.2f}`
                    // formatter: function () {
                    //     return '<b>'   getPointCategoryName(this.point, 'x')   '</b> sold <br><b>'  
                    //         this.point.value   '</b> items on <br><b>'   getPointCategoryName(this.point, 'y')   '</b>';
                    // }
                },
                series: [{
                    name: 'Report Data For Input 1',
                    borderWidth: 1,
                    //data: [[0, 0, 10], [0, 1, 19], [0, 2, 9], [0, 3, 24], [0, 4, 67], [1, 0, 92], [1, 1, 58], [1, 2, 78], [1, 3, 117], [1, 4, 48], [2, 0, 35], [2, 1, 15], [2, 2, 123], [2, 3, 64], [2, 4, 52], [3, 0, 72], [3, 1, 132], [3, 2, 114], [3, 3, 19], [3, 4, 16], [4, 0, 38], [4, 1, 5], [4, 2, 8], [4, 3, 117], [4, 4, 115], [5, 0, 88], [5, 1, 32], [5, 2, 12], [5, 3, 6], [5, 4, 120], [6, 0, 13], [6, 1, 44], [6, 2, 88], [6, 3, 98], [6, 4, 96], [7, 0, 31], [7, 1, 1], [7, 2, 82], [7, 3, 32], [7, 4, 30], [8, 0, 85], [8, 1, 97], [8, 2, 123], [8, 3, 64], [8, 4, 84], [9, 0, 47], [9, 1, 114], [9, 2, 31], [9, 3, 48], [9, 4, 91]],
                    data: arraydata, //[[0,0,-87],[1,0,22],[2,0,33],[3,0,55]],
                    dataLabels: {
                        enabled: false,
                        color: '#000000'
                    }
                }],
                responsive: {
                    rules: [{
                        condition: {
                            maxWidth: 500
                        },
                        chartOptions: {
                            yAxis: {
                                labels: {
                                    formatter: function () {
                                        return this.value.charAt(0);
                                    }
                                }
                            }
                        }
                    }]
                }
            
            });
 

Я пробовал pointInterval и tickInterval, но пока безуспешно.

Комментарии:

1. Массив данных принимает [row, col, value] . поэтому, если вы пропустите точки данных, это определенно покажет пустые / пустые столбцы. Вместо этого просто предоставьте данные, которые вы хотите отобразить, и используйте tickPositioner их для создания пользовательских галочек, чтобы показать, что значение x axes увеличивается на 2

2. Не могли бы вы показать мне с помощью JSFiddle, если не возражаете? Я добавил его в свой вопрос, чтобы было легче показать пример. Я могу достаточно легко изменить галочки, на самом деле они уже правильные, большая проблема заключается в том, чтобы квадраты располагались рядом друг с другом, чтобы пространство использовалось эффективно.

Ответ №1:

Самый простой способ расположить ваши точки рядом друг с другом (без пробелов) — это присвоить им атрибуты x, не пропуская ни одного числа, например 1,2,3,4… Почему бы тебе не попробовать сделать это таким образом?

ДЕМОНСТРАЦИЯ:

https://jsfiddle.net/BlackLabel/39vx468s/

Чтобы пропустить пустые промежутки между точками, вы можете использовать функцию разрывов.

Ссылки на API:

https://api.highcharts.com/highcharts/xAxis.breaks

ДЕМОНСТРАЦИЯ:

https://jsfiddle.net/BlackLabel/et4kryvz/

 xAxis: {
 breaks: [{
  from: 0.5,
  to: 1.5,
  breakSize: 0
 }]
}
 

Существует также другое решение, которое использует свойства colsize и rowsize. Благодаря этому вы можете полностью избежать использования разрывов таким образом, и он даже работает с данными с плавающей запятой.

Демо: https://jsfiddle.net/87tL3ogh/1/

Комментарии:

1. Я собираюсь попробовать это, никогда не думал об использовании перерывов! в конце дня сообщу о результатах. Спасибо!!

2. У меня это работает здесь ( jsfiddle.net/87tL3ogh ), вы можете использовать повтор, чтобы он повторялся в каждом цикле!

3. обновите свой ответ тем, что я поместил в jsfiddle, если вы не возражаете

4. вот новый jsfiddle, я нашел еще лучший ответ, используя rowsize и colsize ( jsfiddle.net/87tL3ogh/1 ), вы можете вообще не использовать разрывы таким образом, и это даже работает с данными с плавающей запятой!

5. Поздравляю с поиском другого решения. Кажется, это работает нормально. 🙂