I'm working with the map of Paraguay. I added an input select to select different years and the maps changes according to my selection.
The thing is, my data always comes in this format:
const departments = [
{agrupacion: 'Asunción', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 105.1, col2016: 108, col2017: 112.2, col2018: 106.9},
{agrupacion: 'Hombre', col2015: 103, col2016: 106.7, col2017: 115, col2018: 106.8},
{agrupacion: 'Mujer', col2015: 107.2, col2016: 109.3, col2017: 109.4, col2018: 107.1},
{agrupacion: 'Concepción', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 77.8, col2016: 79.4, col2017: 82.9, col2018: 74.3},
{agrupacion: 'Hombre', col2015: 76.4, col2016: 80.2, col2017: 81.3, col2018: 71.5},
{agrupacion: 'Mujer', col2015: 79.3, col2016: 78.5, col2017: 84.6, col2018: 77.2},
{agrupacion: 'San Pedro', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 76.8, col2016: 77.7, col2017: 77.2, col2018: 70.2},
{agrupacion: 'Hombre', col2015: 77.2, col2016: 79.1, col2017: 79.8, col2018: 69.5},
{agrupacion: 'Mujer', col2015: 76.3, col2016: 76.3, col2017: 74.5, col2018: 70.9},
{agrupacion: 'Cordillera', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 77.9, col2016: 77.5, col2017: 75.6, col2018: 67.5},
{agrupacion: 'Hombre', col2015: 76.4, col2016: 78.1, col2017: 73.7, col2018: 67.5},
{agrupacion: 'Mujer', col2015: 79.5, col2016: 76.7, col2017: 77.6, col2018: 67.5},
{agrupacion: 'Guairá', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 67.8, col2016: 64.8, col2017: 67.3, col2018: 63.2},
{agrupacion: 'Hombre', col2015: 66.6, col2016: 65.9, col2017: 66.5, col2018: 63.5},
{agrupacion: 'Mujer', col2015: 69, col2016: 63.7, col2017: 68.2, col2018: 62.9},
{agrupacion: 'Caaguazú', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 75, col2016: 74.5, col2017: 76.5, col2018: 73.2},
{agrupacion: 'Hombre', col2015: 75.3, col2016: 73.4, col2017: 75.4, col2018: 72.6},
{agrupacion: 'Mujer', col2015: 74.7, col2016: 75.7, col2017: 77.6, col2018: 73.9},
{agrupacion: 'Caazapá', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 63.6, col2016: 56.6, col2017: 59.8, col2018: 57.1},
{agrupacion: 'Hombre', col2015: 63.9, col2016: 55.6, col2017: 59.6, col2018: 57.4},
{agrupacion: 'Mujer', col2015: 63.2, col2016: 57.5, col2017: 59.9, col2018: 56.8},
{agrupacion: 'Itapúa', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 74.3, col2016: 69.6, col2017: 66.2, col2018: 63.7},
{agrupacion: 'Hombre', col2015: 73.6, col2016: 69.1, col2017: 67.7, col2018: 65.4},
{agrupacion: 'Mujer', col2015: 75.2, col2016: 70.1, col2017: 64.7, col2018: 62},
{agrupacion: 'Misiones', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 79.4, col2016: 74.6, col2017: 79.2, col2018: 72.9},
{agrupacion: 'Hombre', col2015: 81.3, col2016: 72.7, col2017: 77.9, col2018: 72.9},
{agrupacion: 'Mujer', col2015: 77.4, col2016: 76.5, col2017: 80.5, col2018: 72.9},
{agrupacion: 'Paraguarí', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 67.2, col2016: 66, col2017: 63.5, col2018: 62.7},
{agrupacion: 'Hombre', col2015: 67.7, col2016: 67.2, col2017: 65, col2018: 62.3},
{agrupacion: 'Mujer', col2015: 66.7, col2016: 64.8, col2017: 62, col2018: 63.1},
{agrupacion: 'Alto Paraná', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 98.9, col2016: 92.8, col2017: 94.2, col2018: 92.3},
{agrupacion: 'Hombre', col2015: 97, col2016: 93.4, col2017: 94.3, col2018: 92.5},
{agrupacion: 'Mujer', col2015: 100.8, col2016: 92.2, col2017: 94.2, col2018: 92.1},
{agrupacion: 'Central', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 87, col2016: 85.2, col2017: 90.3, col2018: 83.5},
{agrupacion: 'Hombre', col2015: 86.6, col2016: 84.5, col2017: 90.6, col2018: 83.5},
{agrupacion: 'Mujer', col2015: 87.5, col2016: 86, col2017: 90, col2018: 83.4},
{agrupacion: 'Ñeembucú', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 68.4, col2016: 67, col2017: 70.3, col2018: 69.9},
{agrupacion: 'Hombre', col2015: 63.9, col2016: 69.8, col2017: 69.7, col2018: 65.5},
{agrupacion: 'Mujer', col2015: 73.1, col2016: 64.1, col2017: 70.9, col2018: 74.5},
{agrupacion: 'Amambay', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 98, col2016: 100.4, col2017: 100.8, col2018: 95.1},
{agrupacion: 'Hombre', col2015: 99.8, col2016: 100.5, col2017: 101.9, col2018: 97.5},
{agrupacion: 'Mujer', col2015: 96.1, col2016: 100.3, col2017: 99.6, col2018: 92.5},
{agrupacion: 'Canindeyú', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 79.5, col2016: 82.3, col2017: 85, col2018: 82.2},
{agrupacion: 'Hombre', col2015: 77.6, col2016: 79.9, col2017: 82.2, col2018: 82.1},
{agrupacion: 'Mujer', col2015: 81.5, col2016: 84.7, col2017: 88, col2018: 82.4},
{agrupacion: 'Presidente Hayes', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 82, col2016: 81.8, col2017: 87.5, col2018: 78},
{agrupacion: 'Hombre', col2015: 82.9, col2016: 78.6, col2017: 88.5, col2018: 81.3},
{agrupacion: 'Mujer', col2015: 81.1, col2016: 85.2, col2017: 86.4, col2018: 74.6},
{agrupacion: 'Boquerón', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 99.3, col2016: 103.7, col2017: 97.6, col2018: 111.1},
{agrupacion: 'Hombre', col2015: 98.2, col2016: 107.4, col2017: 100.8, col2018: 112.3},
{agrupacion: 'Mujer', col2015: 100.4, col2016: 99.8, col2017: 94.3, col2018: 109.8},
{agrupacion: 'Alto Paraguay', col2015: 0, col2016: 0, col2017: 0, col2018: 0},
{agrupacion: 'Total', col2015: 83, col2016: 75.2, col2017: 88.7, col2018: 81.6},
{agrupacion: 'Hombre', col2015: 88, col2016: 77, col2017: 92, col2018: 90.1},
{agrupacion: 'Mujer', col2015: 77.7, col2016: 73.4, col2017: 85.2, col2018: 72.9}];
With the help of this function I'm able to switch the values for the map according to selection and change the array to a format that I can use in my highmaps:
let selected;
let selection;
$("#example-select").change(function() {
const map_data = [];
var selection = 'col' this.value;
selected = departments.map(e => ({
name: e.agrupacion,
data: e[selection]
}));
$.each(selected, function(key, value) {
map_data.push([data_replace(value.name), value.data]);
});
//Create the chart
Highcharts.mapChart('container_map', {
chart: {
map: topology
},
title: {
text: 'Highcharts Maps basic demo'
},
subtitle: {
text: 'Source map: <a href="http://code.highcharts.com/mapdata/countries/py/py-all.topo.json">Paraguay</a>'
},
mapNavigation: {
enabled: true,
buttonOptions: {
verticalAlign: 'bottom'
}
},
colorAxis: {
min: 0,
color:'#BADA55'
},
series: [{
data: map_data,
name: 'Random data',
states: {
hover: {
color: '#BADA55'
}
},
dataLabels: {
enabled: true,
format: '{point.name}'
}
}]
});
});
})();
This is my data_replace function:
function data_replace (data){
switch(data) {
case 'Concepción':
return 'py-cn'//concepcion
break;
case 'San Pedro':
return 'py-sp'//san pedro
break;
case 'Cordillera':
return 'py-cr'//cordillera
break;
case 'Guairá':
return 'py-gu'//guaira
break;
case 'Caaguazú':
return 'py-cg'//caaguazu
break;
case 'Caazapá':
return 'py-cz'//caazapa
break;
case 'Itapúa':
return 'py-it'//itapua
break;
case 'Misiones':
return 'py-mi'//misiones
break;
case 'Paraguarí':
return 'py-pg'//paraguari
break;
case 'Alto Paraná':
return 'py-aa'//alto parana
break;
case 'Central':
return 'py-ce'//central
break;
case 'Ñeembucú':
return 'py-ne'//ñeembucu
break;
case 'Amambay':
return 'py-am'//amambay
break;
case 'Canindeyú':
return 'py-cy'//canindeyu
break;
case 'Presidente Hayes':
return 'py-ph'//presidente hayes
break;
case 'Boquerón':
return 'py-bq'//boqueron
break;
case 'Alto Paraguay':
return 'py-ag'//alto paraguay
break;
case 'Asunción':
return 'py-as'//asuncion
break;
default:
return data//return default value
break;
}
}
This gives me
console.log(map_data);
the following output:
[["py-as", 0], ["Total", 105.1], ["Hombre", 103], ["Mujer", 107.2], ["py-cn", 0], ["Total", 77.8], ["Hombre", 76.4], ["Mujer", 79.3], ["py-sp", 0], ["Total", 76.8], ["Hombre", 77.2], ["Mujer", 76.3], ["py-cr", 0], ["Total", 77.9], ["Hombre", 76.4], ["Mujer", 79.5], ["py-gu", 0], ["Total", 67.8], ["Hombre", 66.6], ["Mujer", 69], ["py-cg", 0], ["Total", 75], ["Hombre", 75.3], ["Mujer", 74.7], ["py-cz", 0], ["Total", 63.6], ["Hombre", 63.9], ["Mujer", 63.2], ["py-it", 0], ["Total", 74.3], ["Hombre", 73.6], ["Mujer", 75.2], ["py-mi", 0], ["Total", 79.4], ["Hombre", 81.3], ["Mujer", 77.4], ["py-pg", 0], ["Total", 67.2], ["Hombre", 67.7], ["Mujer", 66.7], ["py-aa", 0], ["Total", 98.9], ["Hombre", 97], ["Mujer", 100.8], ["py-ce", 0], ["Total", 87], ["Hombre", 86.6], ["Mujer", 87.5], ["py-ne", 0], ["Total", 68.4], ["Hombre", 63.9], ["Mujer", 73.1], ["py-am", 0], ["Total", 98], ["Hombre", 99.8], ["Mujer", 96.1], ["py-cy", 0], ["Total", 79.5], ["Hombre", 77.6], ["Mujer", 81.5], ["py-ph", 0], ["Total", 82], ["Hombre", 82.9], ["Mujer", 81.1], ["py-bq", 0], ["Total", 99.3], ["Hombre", 98.2], ["Mujer", 100.4], ["py-ag", 0], ["Total", 83], ["Hombre", 88], ["Mujer", 77.7]]
Is there a way I can work with that output so that when I hover on my map it displays the labels like this?
For example I hover over at "Asunción" and it displays the data like this(while year 2015 is selected):
Asunción
Total: 105.1
Hombre: 103
Mujer: 107.2
Here is my demo: https://jsfiddle.net/kenpy/x7635dfz/28/
CodePudding user response:
First of all, you need to convert your data to a readable format for Highcharts.
API: https://api.highcharts.com/highmaps/series.map.data
For example, create separate arrays for each year:
let data2015 = [
['py-ag', 10, 20, 30],
['py-bq', 40, 50, 60]
];
let data2016 = [
['py-ag', 15, 25, 35],
['py-bq', 45, 55, 65]
];
The additional data needs to be connected to the chart, by the series.keys
:
API: https://api.highcharts.com/highcharts/plotOptions.series.keys
plotOptions: {
series: {
keys: ['hc-key', 'total', 'hombre', 'mujer']
}
Then, you can easily refer to this data in the tooltip.formatter
API: https://api.highcharts.com/highcharts/tooltip.formatter
tooltip: {
formatter: function() {
let point = this.point;
return '<b>' point.name '</b><br>' 'Total: ' point.options.total '<br>' 'Hombre: ' point.options.hombre '<br>' 'Mujer: ' point.options.mujer
}
}
For updating data by drop-down list use series.update
method:
API: https://api.highcharts.com/class-reference/Highcharts.Series#update
document.getElementById('select').onchange = function() {
let option = this.value;
if (option === 'data2015') {
chart.series[0].update({
data: data2015,
name: '2015'
});
}
if (option === 'data2016') {
chart.series[0].update({
data: data2016,
name: '2016'
});
}
};