Professional Documents
Culture Documents
<style>
#chartdiv {
max-width: 100%;
height: 800px;
background-color:#212327;
</style>
<script src="https://cdn.amcharts.com/lib/4/core.js"></script>
<script src="https://cdn.amcharts.com/lib/4/charts.js"></script>
<script src="https://cdn.amcharts.com/lib/4/maps.js"></script>
<script src="https://cdn.amcharts.com/lib/4/geodata/worldLow.js"></script>
<script src="https://covid.amcharts.com/data/js/world_timeline.js"></script>
<script src="https://covid.amcharts.com/data/js/total_timeline.js"></script>
<script src="https://cdn.amcharts.com/lib/4/themes/animated.js"></script>
<script>
am4core.ready(function() {
// Themes begin
am4core.useTheme(am4themes_animated);
// Themes end
am4core.ready(function() {
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 1/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
// for an easier access by key
var currentIndex;
var currentPolygon;
var countryDataTimeout;
var currentType;
var currentTypeName;
var sliderAnimation;
//////////////////////////////////////////////////////////////////////////////
// PREPARE DATA
//////////////////////////////////////////////////////////////////////////////
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 2/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
var country = list[i]
countryIndexMap[country.id] = i;
var di = covid_total_timeline[i];
function getSlideData(index) {
if (index == undefined) {
index = covid_world_timeline.length - 1;
//data.list[i].name = idToName(data.list[i].id);
//}
return data;
if(mapData[i].confirmed == 0){
mapData.splice(i, 1);
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 3/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
}
}
var di = mapData[i];
max.confirmed = di.confirmed;
}
if (di.recovered > max.recovered) {
max.recovered = di.recovered;
}
if (di.deaths > max.deaths) {
max.deaths = di.deaths
}
max.active = max.confirmed;
// END OF DATA
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// main container
// https://www.amcharts.com/docs/v4/concepts/svg-engine/containers/
container.width = am4core.percent(100);
container.height = am4core.percent(100);
container.tooltip.background.fill = am4core.color("#000000");
container.tooltip.background.stroke = activeColor;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 4/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
container.tooltip.fontSize = "0.9em";
container.tooltip.getFillFromObject = false;
container.tooltip.getStrokeFromObject = false;
// MAP CHART
// https://www.amcharts.com/docs/v4/chart-types/map/
mapChart.height = am4core.percent(80);
mapChart.zoomControl.align = "right";
mapChart.zoomControl.marginRight = 15;
mapChart.zoomControl.valign = "middle";
// by default minus button zooms out by one step, but we modify the behavior so when user clicks on
minus, the map would fully zoom-out and show world data
mapChart.zoomControl.minusButton.events.on("hit", showWorld);
mapChart.seriesContainer.background.events.on("hit", showWorld);
mapChart.seriesContainer.background.events.on("over", resetHover);
mapChart.seriesContainer.background.fillOpacity = 0;
mapChart.zoomEasing = am4core.ease.sinOut;
// https://www.amcharts.com/docs/v4/chart-types/map/#Map_data
// you can use more accurate world map or map of any other country - a wide selection of maps
available at: https://github.com/amcharts/amcharts4-geodata
mapChart.geodata = am4geodata_worldLow;
// Set projection
// https://www.amcharts.com/docs/v4/chart-types/map/#Setting_projection
// instead of Miller, you can use Mercator or many other projections available:
https://www.amcharts.com/demos-v4/map-using-d3-projections/
mapChart.panBehavior = "move";
mapChart.backgroundSeries.mapPolygons.template.polygon.fillOpacity = 0.05;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 5/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
mapChart.backgroundSeries.mapPolygons.template.polygon.fill = am4core.color("#ffffff");
mapChart.backgroundSeries.hidden = true;
// Map polygon series (defines how country areas look and behave)
polygonSeries.dataFields.id = "id";
polygonSeries.dataFields.value = "confirmedPC";
polygonSeries.interpolationDuration = 0;
polygonSeries.useGeodata = true;
polygonSeries.nonScalingStroke = true;
polygonSeries.strokeWidth = 0.5;
polygonSeries.calculateVisualCenter = true;
polygonSeries.data = mapData;
polygonTemplate.fill = countryColor;
polygonTemplate.fillOpacity = 1
polygonTemplate.stroke = countryStrokeColor;
polygonTemplate.strokeOpacity = 0.15
polygonTemplate.setStateOnChildren = true;
polygonTemplate.tooltipPosition = "fixed";
polygonTemplate.events.on("hit", handleCountryHit);
polygonTemplate.events.on("over", handleCountryOver);
polygonTemplate.events.on("out", handleCountryOut);
polygonSeries.heatRules.push({
"target": polygonTemplate,
"property": "fill",
"min": countryColor,
"max": countryColor,
"dataField": "value"
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 6/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
})
// you can have pacific - centered map if you set this to -154.8
mapChart.deltaLongitude = -10;
// polygon states
polygonHoverState.transitionDuration = 1400;
polygonHoverState.properties.fill = countryHoverColor;
polygonActiveState.properties.fill = activeCountryColor;
// Bubble series
bubbleSeries.data = JSON.parse(JSON.stringify(mapData));
bubbleSeries.dataFields.value = "confirmed";
bubbleSeries.dataFields.id = "id";
// adjust tooltip
bubbleSeries.tooltip.animationDuration = 0;
bubbleSeries.tooltip.showInViewport = false;
bubbleSeries.tooltip.background.fillOpacity = 0.2;
bubbleSeries.tooltip.getStrokeFromObject = true;
bubbleSeries.tooltip.getFillFromObject = false;
bubbleSeries.tooltip.background.fillOpacity = 0.2;
bubbleSeries.tooltip.background.fill = am4core.color("#000000");
// if you want bubbles to become bigger when zoomed, set this to false
imageTemplate.nonScaling = true;
imageTemplate.strokeOpacity = 0;
imageTemplate.fillOpacity = 0.55;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 7/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
imageTemplate.applyOnClones = true;
imageTemplate.events.on("over", handleImageOver);
imageTemplate.events.on("out", handleImageOut);
imageTemplate.events.on("hit", handleImageHit);
// this is needed for the tooltip to point to the top of the circle instead of the middle
return -target.children.getIndex(0).radius;
})
imageHoverState.properties.fillOpacity = 1;
circle.hiddenState.properties.scale = 0.0001;
circle.hiddenState.transitionDuration = 2000;
circle.defaultState.transitionDuration = 2000;
circle.defaultState.transitionEasing = am4core.ease.elasticOut;
// later we set fill color on template (when changing what type of data the map should show) and all
the clones get the color because of this
circle.applyOnClones = true;
// heat rule makes the bubbles to be of a different width. Adjust min/max for smaller/bigger radius
of a bubble
bubbleSeries.heatRules.push({
"target": circle,
"property": "radius",
"min": 3,
"max": 30,
"dataField": "value"
})
// when data items validated, hide 0 value bubbles (because min size is set)
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 8/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
bubbleSeries.events.on("dataitemsvalidated", function() {
bubbleSeries.dataItems.each((dataItem) => {
if (mapImage.dataItem.value == 0) {
circle.hide(0);
circle.show();
})
})
if (polygon) {
target.disabled = false;
return polygon.visualLatitude;
}
else {
target.disabled = true;
}
return latitude;
})
if (polygon) {
target.disabled = false;
return polygon.visualLongitude;
}
else {
target.disabled = true;
}
return longitude;
})
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 9/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
// END OF MAP
// top title
title.fontSize = "1.5em";
title.align = "left";
title.horizontalCenter = "left";
title.marginLeft = 20;
title.paddingBottom = 10;
title.fill = am4core.color("#ffffff");
title.y = 20;
mapGlobeSwitch.align = "right"
mapGlobeSwitch.y = 15;
mapGlobeSwitch.leftLabel.text = "Map";
mapGlobeSwitch.leftLabel.fill = am4core.color("#ffffff");
mapGlobeSwitch.rightLabel.fill = am4core.color("#ffffff");
mapGlobeSwitch.rightLabel.text = "Globe";
mapGlobeSwitch.verticalCenter = "top";
mapGlobeSwitch.events.on("toggled", function() {
if (mapGlobeSwitch.isActive) {
mapChart.backgroundSeries.show();
mapChart.panBehavior = "rotateLongLat";
polygonSeries.exclude = [];
} else {
mapChart.backgroundSeries.hide();
mapChart.panBehavior = "move";
removeAntarctica(mapData);
polygonSeries.data = mapData;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 10/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
polygonSeries.exclude = ["AQ"];
}
})
absolutePerCapitaSwitch.align = "center"
absolutePerCapitaSwitch.y = 15;
absolutePerCapitaSwitch.leftLabel.text = "Absolute";
absolutePerCapitaSwitch.leftLabel.fill = am4core.color("#ffffff");
absolutePerCapitaSwitch.rightLabel.fill = am4core.color("#ffffff");
absolutePerCapitaSwitch.rightLabel.interactionsEnabled = true;
absolutePerCapitaSwitch.verticalCenter = "top";
absolutePerCapitaSwitch.events.on("toggled", function() {
if (absolutePerCapitaSwitch.isActive) {
bubbleSeries.hide(0);
perCapita = true;
bubbleSeries.interpolationDuration = 0;
polygonSeries.heatRules.getIndex(0).max = colors[currentType];
polygonSeries.heatRules.getIndex(0).maxValue = maxPC[currentType];
polygonSeries.mapPolygons.template.applyOnClones = true;
sizeSlider.hide()
filterSlider.hide();
sizeLabel.hide();
filterLabel.hide();
updateCountryTooltip();
} else {
perCapita = false;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 11/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
polygonSeries.interpolationDuration = 0;
bubbleSeries.interpolationDuration = 1000;
bubbleSeries.show();
polygonSeries.heatRules.getIndex(0).max = countryColor;
polygonSeries.mapPolygons.template.tooltipText = undefined;
sizeSlider.show()
filterSlider.show();
sizeLabel.show();
filterLabel.show();
}
polygonSeries.mapPolygons.each(function(mapPolygon) {
mapPolygon.fill = mapPolygon.fill;
mapPolygon.defaultState.properties.fill = undefined;
})
})
buttonsAndChartContainer.layout = "vertical";
buttonsAndChartContainer.width = am4core.percent(100);
buttonsAndChartContainer.valign = "bottom";
nameAndButtonsContainer.width = am4core.percent(100);
nameAndButtonsContainer.layout = "horizontal";
countryName.fontSize = "1.1em";
countryName.fill = am4core.color("#ffffff");
countryName.valign = "middle";
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 12/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
// buttons container (active/confirmed/recovered/deaths)
buttonsContainer.layout = "grid";
buttonsContainer.width = am4core.percent(100);
buttonsContainer.x = 10;
buttonsContainer.contentAlign = "right";
chartAndSliderContainer.layout = "vertical";
chartAndSliderContainer.height = am4core.percent(100);
chartAndSliderContainer.width = am4core.percent(100);
chartAndSliderContainer.background.fill = am4core.color("#000000");
chartAndSliderContainer.background.cornerRadius(30, 30, 0, 0)
chartAndSliderContainer.background.fillOpacity = 0.25;
chartAndSliderContainer.paddingTop = 12;
chartAndSliderContainer.paddingBottom = 0;
// Slider container
sliderContainer.width = am4core.percent(100);
sliderContainer.layout = "horizontal";
slider.width = am4core.percent(100);
slider.valign = "middle";
slider.background.opacity = 0.4;
slider.opacity = 0.7;
slider.background.fill = am4core.color("#ffffff");
slider.marginLeft = 20;
slider.marginRight = 35;
slider.height = 15;
slider.start = 1;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 13/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
// what to do when slider is dragged
slider.events.on("rangechanged", function(event) {
updateMapData(getSlideData(index).list);
updateTotals(index);
})
slider.startGrip.events.on("drag", () => {
stop();
if (sliderAnimation) {
sliderAnimation.setProgress(slider.start);
}
});
// play button
playButton.valign = "middle";
playButton.events.on("toggled", function(event) {
if (event.target.isActive) {
play();
} else {
stop();
}
})
slider.startGrip.background.fill = playButton.background.fill;
slider.startGrip.background.strokeOpacity = 0;
slider.startGrip.icon.stroke = am4core.color("#ffffff");
slider.startGrip.background.states.copyFrom(playButton.background.states)
sizeSlider.orientation = "vertical";
sizeSlider.height = am4core.percent(12);
sizeSlider.marginLeft = 25;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 14/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
sizeSlider.align = "left";
sizeSlider.valign = "top";
sizeSlider.verticalCenter = "middle";
sizeSlider.opacity = 0.7;
sizeSlider.background.fill = am4core.color("#ffffff");
})
sizeSlider.startGrip.background.fill = activeColor;
sizeSlider.startGrip.background.fillOpacity = 0.8;
sizeSlider.startGrip.background.strokeOpacity = 0;
sizeSlider.startGrip.icon.stroke = am4core.color("#ffffff");
sizeSlider.startGrip.background.states.getKey("hover").properties.fill = activeColor;
sizeSlider.startGrip.background.states.getKey("down").properties.fill = activeColor;
sizeSlider.horizontalCenter = "middle";
sizeSlider.events.on("rangechanged", function() {
circle.clones.each(function(clone) {
clone.radius = clone.radius;
})
})
sizeLabel.fill = am4core.color("#ffffff");
sizeLabel.rotation = 90;
sizeLabel.fontSize = "10px";
sizeLabel.fillOpacity = 0.5;
sizeLabel.horizontalCenter = "middle";
sizeLabel.align = "left"
sizeLabel.paddingBottom = 40;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 15/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
sizeLabel.tooltip.label.wrap = true;
sizeLabel.tooltip.label.maxWidth = 300;
sizeLabel.tooltipText = "Some countries have so many cases that bubbles for countries with smaller
values often look the same even if there is a significant difference between them. This slider can be
used to increase maximum size of a bubble so that when you zoom in to a region with relatively small
values you could compare them anyway."
sizeLabel.fill = am4core.color("#ffffff");
})
// filter slider
filterSlider.orientation = "vertical";
filterSlider.height = am4core.percent(28);
filterSlider.marginLeft = 25;
filterSlider.align = "left";
filterSlider.valign = "top";
filterSlider.verticalCenter = "middle";
filterSlider.opacity = 0.7;
filterSlider.background.fill = am4core.color("#ffffff");
})
filterSlider.startGrip.background.fill = activeColor;
filterSlider.startGrip.background.fillOpacity = 0.8;
filterSlider.startGrip.background.strokeOpacity = 0;
filterSlider.startGrip.icon.stroke = am4core.color("#ffffff");
filterSlider.startGrip.background.states.getKey("hover").properties.fill = activeColor;
filterSlider.startGrip.background.states.getKey("down").properties.fill = activeColor;
filterSlider.horizontalCenter = "middle";
filterSlider.start = 1;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 16/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
filterSlider.events.on("rangechanged", function() {
bubbleSeries.heatRules.getIndex(0).maxValue = maxValue;
circle.clones.each(function(clone) {
clone.dataItem.hide();
else {
clone.dataItem.show();
clone.radius = clone.radius;
})
}
})
filterLabel.rotation = 90;
filterLabel.fontSize = "10px";
filterLabel.fill = am4core.color("#ffffff");
filterLabel.fontSize = "0.8em";
filterLabel.fillOpacity = 0.5;
filterLabel.horizontalCenter = "middle";
filterLabel.align = "left"
filterLabel.paddingBottom = 40;
filterLabel.tooltip.label.wrap = true;
filterLabel.tooltip.label.maxWidth = 300;
filterLabel.tooltipText = "This filter allows to remove countries with many cases from the map so
that it would be possible to compare countries with smaller number of cases."
filterLabel.fill = am4core.color("#ffffff");
})
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 17/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
// play behavior
function play() {
if (!sliderAnimation) {
sliderAnimation.events.on("animationended", () => {
playButton.isActive = false;
})
if (slider.start >= 1) {
slider.start = 0;
sliderAnimation.start();
}
sliderAnimation.resume();
playButton.isActive = true;
// stop behavior
function stop() {
if (sliderAnimation) {
sliderAnimation.pause();
}
playButton.isActive = false;
// BOTTOM CHART
// https://www.amcharts.com/docs/v4/chart-types/xy-chart/
lineChart.fontSize = "0.8em";
lineChart.paddingRight = 30;
lineChart.paddingLeft = 30;
lineChart.maskBullets = false;
lineChart.zoomOutButton.disabled = true;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 18/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
lineChart.paddingBottom = 5;
lineChart.paddingTop = 3;
lineChart.data = JSON.parse(JSON.stringify(covid_total_timeline));
// date axis
// https://www.amcharts.com/docs/v4/concepts/axes/date-axis/
dateAxis.renderer.minGridDistance = 50;
dateAxis.renderer.grid.template.stroke = am4core.color("#000000");
dateAxis.renderer.grid.template.strokeOpacity = 0.25;
dateAxis.tooltip.label.fontSize = "0.8em";
dateAxis.tooltip.background.fill = activeColor;
dateAxis.tooltip.background.stroke = activeColor;
dateAxis.renderer.labels.template.fill = am4core.color("#ffffff");
/*
})*/
// value axis
// https://www.amcharts.com/docs/v4/concepts/axes/value-axis/
valueAxis.renderer.opposite = true;
valueAxis.interpolationDuration = 3000;
valueAxis.renderer.grid.template.stroke = am4core.color("#000000");
valueAxis.renderer.grid.template.strokeOpacity = 0.25;
valueAxis.renderer.minGridDistance = 30;
valueAxis.renderer.maxLabelPosition = 0.98;
valueAxis.renderer.baseGrid.disabled = true;
valueAxis.tooltip.disabled = true;
valueAxis.extraMax = 0.05;
valueAxis.maxPrecision = 0;
valueAxis.renderer.inside = true;
valueAxis.renderer.labels.template.verticalCenter = "bottom";
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 19/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
valueAxis.renderer.labels.template.fill = am4core.color("#ffffff");
valueAxis.renderer.labels.template.padding(2, 2, 2, 2);
if (max < 5) {
max = 5
}
return max;
})
if (!seriesTypeSwitch.isActive) {
if (min < 0) {
min = 0;
}
return min;
})
// cursor
// https://www.amcharts.com/docs/v4/concepts/chart-cursor/
lineChart.cursor.maxTooltipDistance = 0;
lineChart.cursor.lineY.disabled = true;
lineChart.cursor.lineX.stroke = activeColor;
lineChart.cursor.xAxis = dateAxis;
// this prevents cursor to move to the clicked location while map is dragged
am4core.getInteraction().body.events.off("down", lineChart.cursor.handleCursorDown,
lineChart.cursor)
// legend
// https://www.amcharts.com/docs/v4/concepts/legend/
lineChart.legend.parent = lineChart.plotContainer;
lineChart.legend.labels.template.fill = am4core.color("#ffffff");
lineChart.legend.markers.template.height = 8;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 20/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
lineChart.legend.contentAlign = "left";
lineChart.legend.fontSize = "10px";
lineChart.legend.itemContainers.template.valign = "middle";
legendDown = true;
})
lineChart.legend.itemContainers.template.events.on("up", function() {
setTimeout(function() {
legendDown = false;
}, 100)
})
seriesTypeSwitch.leftLabel.text = "totals";
seriesTypeSwitch.leftLabel.fill = am4core.color("#ffffff");
seriesTypeSwitch.rightLabel.fill = am4core.color("#ffffff");
seriesTypeSwitch.events.on("down", function() {
legendDown = true;
})
seriesTypeSwitch.events.on("up", function() {
setTimeout(function() {
legendDown = false;
}, 100)
})
seriesTypeSwitch.events.on("toggled", function() {
if (seriesTypeSwitch.isActive) {
if (!columnSeries) {
createColumnSeries();
columnSeries[key].hide(0);
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 21/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
}
series[key].hiddenInLegend = true;
series[key].hide();
columnSeries[currentType].show();
}
else {
columnSeries[key].hiddenInLegend = true;
columnSeries[key].hide();
series[key].hiddenInLegend = false;
series[key].hide();
series[currentType].show();
}
})
function updateColumnsFill() {
columnSeries.active.columns.each(function(column) {
if (column.dataItem.values.valueY.previousChange < 0) {
column.fillOpacity = 0;
column.strokeOpacity = 0.6;
else {
column.fillOpacity = 0.6;
column.strokeOpacity = 0;
})
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 22/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
// create series
activeSeries.tooltip.disabled = true;
activeSeries.hidden = false;
// add series
series.dataFields.valueY = name;
series.dataFields.dateX = "date";
series.name = capitalizeFirstLetter(name);
series.strokeOpacity = 0.6;
series.stroke = color;
series.fill = color;
series.maskBullets = false;
series.minBulletDistance = 10;
series.hidden = true;
series.hideTooltipWhileZooming = true;
// series bullet
bullet.setStateOnChildren = true;
bullet.circle.fillOpacity = 1;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 23/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
bullet.circle.fill = backgroundColor;
bullet.circle.radius = 2;
circleHoverState.properties.fillOpacity = 1;
circleHoverState.properties.fill = color;
circleHoverState.properties.scale = 1.4;
// tooltip setup
series.tooltip.pointerOrientation = "down";
series.tooltip.getStrokeFromObject = true;
series.tooltip.getFillFromObject = false;
series.tooltip.background.fillOpacity = 0.2;
series.tooltip.background.fill = am4core.color("#000000");
series.tooltip.dy = -4;
series.tooltip.fontSize = "0.8em";
return series;
var columnSeries;
function createColumnSeries() {
columnSeries = {}
columnSeries.active.events.on("validated", function() {
updateColumnsFill();
})
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 24/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
}
// add series
series.dataFields.valueY = name;
series.dataFields.valueYShow = "previousChange";
series.dataFields.dateX = "date";
series.name = capitalizeFirstLetter(name);
series.hidden = true;
series.stroke = color;
series.fill = color;
series.columns.template.fillOpacity = 0.6;
series.columns.template.strokeOpacity = 0;
series.hideTooltipWhileZooming = true;
series.clustered = false;
series.hiddenInLegend = true;
series.columns.template.width = am4core.percent(50);
// tooltip setup
series.tooltip.pointerOrientation = "down";
series.tooltip.getStrokeFromObject = true;
series.tooltip.getFillFromObject = false;
series.tooltip.background.fillOpacity = 0.2;
series.tooltip.background.fill = am4core.color("#000000");
series.tooltip.fontSize = "0.8em";
return series;
lineChart.plotContainer.events.on("up", function() {
if (!legendDown) {
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 25/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
})
label.text = "Current day stats may be incomplete until countries submit their data.";
label.fill = am4core.color("#ffffff");
label.fontSize = "0.8em";
label.paddingBottom = 4;
label.opacity = 0.5;
label.align = "right";
label.horizontalCenter = "right";
label.verticalCenter = "bottom";
// BUTTONS
// create buttons
// add button
button.label.valign = "middle"
button.label.fill = am4core.color("#ffffff");
button.label.fontSize = "11px";
button.background.strokeOpacity = 0.3
button.background.fillOpacity = 0;
button.background.stroke = buttonStrokeColor;
button.background.padding(2, 3, 2, 3);
button.states.create("active");
button.setStateOnChildren = true;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 26/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
activeHoverState.properties.fillOpacity = 0;
circle.radius = 8;
circle.fillOpacity = 0.3;
circle.fill = buttonStrokeColor;
circle.strokeOpacity = 0;
circle.valign = "middle";
circle.marginRight = 5;
button.icon = circle;
button.dummyData = name;
circleActiveState.properties.fill = color;
circleActiveState.properties.fillOpacity = 0.5;
button.events.on("hit", handleButtonClick);
return button;
function handleButtonClick(event) {
changeDataType(event.target.dummyData);
function changeDataType(name) {
currentType = name;
currentTypeName = name;
if (name != "deaths") {
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 27/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
}
activeButton.isActive = true;
buttons[key].isActive = false;
}
// tell series new field name
bubbleSeries.dataFields.value = name;
bubbleSeries.dataItems.each(function(dataItem) {
dataItem.setValue("value", dataItem.dataContext[currentType]);
})
polygonSeries.dataItems.each(function(dataItem) {
dataItem.mapPolygon.defaultState.properties.fill = undefined;
})
bubbleSeries.mapImages.template.fill = colors[name];
bubbleSeries.mapImages.template.stroke = colors[name];
bubbleSeries.mapImages.template.children.getIndex(0).fill = colors[name];
dateAxis.tooltip.background.fill = colors[name];
dateAxis.tooltip.background.stroke = colors[name];
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 28/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
lineChart.cursor.lineX.stroke = colors[name];
// show series
if (seriesTypeSwitch.isActive) {
activeSeries.show();
if (columnSeries[key] != activeSeries) {
columnSeries[key].hide();
}
else {
activeSeries.show();
if (series[key] != activeSeries) {
series[key].hide();
bubbleSeries.heatRules.getIndex(0).maxValue = max[currentType];
polygonSeries.heatRules.getIndex(0).maxValue = maxPC[currentType];
if (perCapita) {
polygonSeries.heatRules.getIndex(0).max = colors[name];
updateCountryTooltip();
}
}
// select a country
function selectCountry(mapPolygon) {
resetHover();
polygonSeries.hideTooltip();
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 29/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
if (currentPolygon == mapPolygon) {
currentPolygon.isActive = false;
currentPolygon = undefined;
showWorld();
return;
}
// save current polygon
currentPolygon = mapPolygon;
currentCountry = mapPolygon.dataItem.dataContext.name;
polygonSeries.mapPolygons.each(function(polygon) {
polygon.isActive = false;
})
if (countryDataTimeout) {
clearTimeout(countryDataTimeout);
}
// we delay change of data for better performance (so that data is not changed whil zooming)
countryDataTimeout = setTimeout(function() {
setCountryData(countryIndex);
updateTotals(currentIndex);
updateCountryName();
mapPolygon.isActive = true;
if (mapGlobeSwitch.isActive) {
if (mapChart.zoomLevel != 1) {
mapChart.goHome();
rotateAndZoom(mapPolygon);
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 30/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
}
else {
rotateAndZoom(mapPolygon);
}
// if it's not a globe, simply zoom to the country
else {
mapChart.zoomToMapObject(mapPolygon, getZoomLevel(mapPolygon));
}
}
function setCountryData(countryIndex) {
// instead of setting whole data array, we modify current raw data so that a nice animation would
happen
var di = covid_world_timeline[i].list;
if (countryData) {
dataContext.recovered = countryData.recovered;
dataContext.confirmed = countryData.confirmed;
dataContext.deaths = countryData.deaths;
valueAxis.min = undefined;
valueAxis.max = undefined;
else {
dataContext.recovered = 0;
dataContext.confirmed = 0;
dataContext.deaths = 0;
dataContext.active = 0;
valueAxis.min = 0;
valueAxis.max = 10;
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 31/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
lineChart.invalidateRawData();
updateTotals(currentIndex);
setTimeout(updateSeriesTooltip, 1000);
function updateSeriesTooltip() {
position = dateAxis.toGlobalPosition(position);
var x = dateAxis.positionToCoordinate(position);
lineChart.series.each(function(series) {
if (!series.isHidden) {
series.tooltip.disabled = false;
series.showTooltipAtDataItem(series.tooltipDataItem);
})
function rollOverCountry(mapPolygon) {
resetHover();
if (mapPolygon) {
mapPolygon.isHover = true;
if (image) {
image.dataItem.dataContext.name = mapPolygon.dataItem.dataContext.name;
image.isHover = true;
}
}
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 32/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
function rollOutCountry(mapPolygon) {
resetHover();
if (image) {
image.isHover = false;
}
}
function rotateAndZoom(mapPolygon) {
polygonSeries.hideTooltip();
animation.events.on("animationended", function() {
mapChart.zoomToMapObject(mapPolygon, getZoomLevel(mapPolygon));
})
function getZoomLevel(mapPolygon) {
var w = mapPolygon.polygon.bbox.width;
var h = mapPolygon.polygon.bbox.width;
function showWorld() {
currentCountry = "World";
currentPolygon = undefined;
resetHover();
if (countryDataTimeout) {
clearTimeout(countryDataTimeout);
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 33/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
// make all inactive
polygonSeries.mapPolygons.each(function(polygon) {
polygon.isActive = false;
})
updateCountryName();
// update line chart data (again, modifying instead of setting new data for a nice animation)
var di = covid_total_timeline[i];
dataContext.recovered = di.recovered;
dataContext.confirmed = di.confirmed;
dataContext.deaths = di.deaths;
valueAxis.min = undefined;
valueAxis.max = undefined;
lineChart.invalidateRawData();
updateTotals(currentIndex);
mapChart.goHome();
function updateCountryName() {
function updateTotals(index) {
if (!isNaN(index)) {
var di = covid_total_timeline[index];
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 34/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
currentDate = date;
updateCountryName();
position = dateAxis.toGlobalPosition(position);
var x = dateAxis.positionToCoordinate(position);
if (lineChart.cursor) {
if (!isNaN(count)) {
currentIndex = index;
}
}
function updateMapData(data) {
bubbleSeries.dataItems.each(function(dataItem) {
dataItem.dataContext.confirmed = 0;
dataItem.dataContext.deaths = 0;
dataItem.dataContext.recovered = 0;
dataItem.dataContext.active = 0;
})
var di = data[i];
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 35/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
var polygon = polygonSeries.getPolygonById(di.id);
if (image) {
image.dataItem.dataContext.confirmed = di.confirmed;
image.dataItem.dataContext.deaths = di.deaths;
image.dataItem.dataContext.recovered = di.recovered;
if (polygon) {
maxPC.confirmed = polygon.dataItem.dataContext.confirmedPC;
maxPC.deaths = polygon.dataItem.dataContext.deathsPC;
maxPC.recovered = polygon.dataItem.dataContext.recoveredPC;
maxPC.active = polygon.dataItem.dataContext.activePC;
bubbleSeries.heatRules.getIndex(0).maxValue = max[currentType];
polygonSeries.heatRules.getIndex(0).maxValue = maxPC[currentType];
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 36/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
bubbleSeries.invalidateRawData();
polygonSeries.invalidateRawData();
}
}
function capitalizeFirstLetter(string) {
function handleImageOver(event) {
rollOverCountry(polygonSeries.getPolygonById(event.target.dataItem.id));
function handleImageOut(event) {
rollOutCountry(polygonSeries.getPolygonById(event.target.dataItem.id));
function handleImageHit(event) {
selectCountry(polygonSeries.getPolygonById(event.target.dataItem.id));
function handleCountryHit(event) {
selectCountry(event.target);
function handleCountryOver(event) {
rollOverCountry(event.target);
function handleCountryOut(event) {
rollOutCountry(event.target);
function resetHover() {
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 37/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
polygonSeries.mapPolygons.each(function(polygon) {
polygon.isHover = false;
})
bubbleSeries.mapImages.each(function(image) {
image.isHover = false;
})
container.events.on("layoutvalidated", function() {
dateAxis.tooltip.hide();
lineChart.cursor.hide();
updateTotals(currentIndex);
});
updateCountryName();
changeDataType("active");
//populateCountries(slideData.list);
setTimeout(updateSeriesTooltip, 3000);
function updateCountryTooltip() {
polygonSeries.mapPolygons.template.tooltipText = "[bold]{name}: {value.formatNumber('#.')}
[/]\n[font-size:10px]" + currentTypeName + " per million"
/**
* Country/state list on the right
*/
/*
function populateCountries(list) {
table.find(".area").remove();
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 38/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
function() {
selectCountry(polygonSeries.getPolygonById($(this).data("areaid")));
}).hover(function() {
rollOverCountry(polygonSeries.getPolygonById($(this).data("areaid")));
});
$("<td>").appendTo(tr).data("areaid", area.id).html(area.name);
$("<td>").addClass("value").appendTo(tr).html(area.confirmed);
$("<td>").addClass("value").appendTo(tr).html(area.deaths);
$("<td>").addClass("value").appendTo(tr).html(area.recovered);
}
$("#areas").DataTable({
"paging": false,
"select": true
}).column("1")
.order("desc")
.draw();;
*/
//function idToName(id) {
//}
function removeAntarctica(mapData) {
if (mapData[i].id == "AQ") {
mapData.splice(i, 1);
}
}
var populations = {
"AD": "84000",
"AE": "4975593",
"AF": "29121286",
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 39/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
"AG": "86754",
"AI": "13254",
"AL": "2986952",
"AM": "2968000",
"AN": "300000",
"AO": "13068161",
"AQ": "0",
"AR": "41343201",
"AS": "57881",
"AT": "8205000",
"AU": "21515754",
"AW": "71566",
"AX": "26711",
"AZ": "8303512",
"BA": "4590000",
"BB": "285653",
"BD": "156118464",
"BE": "10403000",
"BF": "16241811",
"BG": "7148785",
"BH": "738004",
"BI": "9863117",
"BJ": "9056010",
"BL": "8450",
"BM": "65365",
"BN": "395027",
"BO": "9947418",
"BQ": "18012",
"BR": "201103330",
"BS": "301790",
"BT": "699847",
"BV": "0",
"BW": "2029307",
"BY": "9685000",
"BZ": "314522",
"CA": "33679000",
"CC": "628",
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 40/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
"CD": "70916439",
"CF": "4844927",
"CG": "3039126",
"CH": "7581000",
"CI": "21058798",
"CK": "21388",
"CL": "16746491",
"CM": "19294149",
"CN": "1330044000",
"CO": "47790000",
"CR": "4516220",
"CS": "10829175",
"CU": "11423000",
"CV": "508659",
"CW": "141766",
"CX": "1500",
"CY": "1102677",
"CZ": "10476000",
"DE": "81802257",
"DJ": "740528",
"DK": "5484000",
"DM": "72813",
"DO": "9823821",
"DZ": "34586184",
"EC": "14790608",
"EE": "1291170",
"EG": "80471869",
"EH": "273008",
"ER": "5792984",
"ES": "46505963",
"ET": "88013491",
"FI": "5244000",
"FJ": "875983",
"FK": "2638",
"FM": "107708",
"FO": "48228",
"FR": "64768389",
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 41/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
"GA": "1545255",
"GB": "62348447",
"GD": "107818",
"GE": "4630000",
"GF": "195506",
"GG": "65228",
"GH": "24339838",
"GI": "27884",
"GL": "56375",
"GM": "1593256",
"GN": "10324025",
"GP": "443000",
"GQ": "1014999",
"GR": "11000000",
"GS": "30",
"GT": "13550440",
"GU": "159358",
"GW": "1565126",
"GY": "748486",
"HK": "6898686",
"HM": "0",
"HN": "7989415",
"HR": "4284889",
"HT": "9648924",
"HU": "9982000",
"ID": "242968342",
"IE": "4622917",
"IL": "7353985",
"IM": "75049",
"IN": "1173108018",
"IO": "4000",
"IQ": "29671605",
"IR": "76923300",
"IS": "308910",
"IT": "60340328",
"JE": "90812",
"JM": "2847232",
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 42/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
"JO": "6407085",
"JP": "127288000",
"KE": "40046566",
"KG": "5776500",
"KH": "14453680",
"KI": "92533",
"KM": "773407",
"KN": "51134",
"KP": "22912177",
"KR": "48422644",
"KW": "2789132",
"KY": "44270",
"KZ": "15340000",
"LA": "6368162",
"LB": "4125247",
"LC": "160922",
"LI": "35000",
"LK": "21513990",
"LR": "3685076",
"LS": "1919552",
"LT": "2944459",
"LU": "497538",
"LV": "2217969",
"LY": "6461454",
"MA": "33848242",
"MC": "32965",
"MD": "4324000",
"ME": "666730",
"MF": "35925",
"MG": "21281844",
"MH": "65859",
"MK": "2062294",
"ML": "13796354",
"MM": "53414374",
"MN": "3086918",
"MO": "449198",
"MP": "53883",
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 43/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
"MQ": "432900",
"MR": "3205060",
"MS": "9341",
"MT": "403000",
"MU": "1294104",
"MV": "395650",
"MW": "15447500",
"MX": "112468855",
"MY": "28274729",
"MZ": "22061451",
"NA": "2128471",
"NC": "216494",
"NE": "15878271",
"NF": "1828",
"NG": "154000000",
"NI": "5995928",
"NL": "16645000",
"NO": "5009150",
"NP": "28951852",
"NR": "10065",
"NU": "2166",
"NZ": "4252277",
"OM": "2967717",
"PA": "3410676",
"PE": "29907003",
"PF": "270485",
"PG": "6064515",
"PH": "99900177",
"PK": "184404791",
"PL": "38500000",
"PM": "7012",
"PN": "46",
"PR": "3916632",
"PS": "3800000",
"PT": "10676000",
"PW": "19907",
"PY": "6375830",
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 44/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
"QA": "840926",
"RE": "776948",
"RO": "21959278",
"RS": "7344847",
"RU": "140702000",
"RW": "11055976",
"SA": "25731776",
"SB": "559198",
"SC": "88340",
"SD": "35000000",
"SE": "9828655",
"SG": "4701069",
"SH": "7460",
"SI": "2007000",
"SJ": "2550",
"SK": "5455000",
"SL": "5245695",
"SM": "31477",
"SN": "12323252",
"SO": "10112453",
"SR": "492829",
"SS": "8260490",
"ST": "175808",
"SV": "6052064",
"SX": "37429",
"SY": "22198110",
"SZ": "1354051",
"TC": "20556",
"TD": "10543464",
"TF": "140",
"TG": "6587239",
"TH": "67089500",
"TJ": "7487489",
"TK": "1466",
"TL": "1154625",
"TM": "4940916",
"TN": "10589025",
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 45/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
"TO": "122580",
"TR": "77804122",
"TT": "1228691",
"TV": "10472",
"TW": "22894384",
"TZ": "41892895",
"UA": "45415596",
"UG": "33398682",
"UM": "0",
"US": "310232863",
"UY": "3477000",
"UZ": "27865738",
"VA": "921",
"VC": "104217",
"VE": "27223228",
"VG": "21730",
"VI": "108708",
"VN": "89571130",
"VU": "221552",
"WF": "16025",
"WS": "192001",
"XK": "1800000",
"YE": "23495361",
"YT": "159042",
"ZA": "49000000",
"ZM": "13460305",
"ZW": "13061000"
}
});
</script>
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 46/47
2/23/22, 7:48 PM Coronavirus animated dashboard - amCharts
<!-- HTML -->
<div id="chartdiv"></div>
https://www.amcharts.com/demos-v4/corona-virus-animated-dashboard-v4/ 47/47