Create world map charts with svgMap

svgMap is a JavaScript library that lets you easily create an interactable world map comparing customizable data for each country.

Install

ES6

You can install svgMap via npm:

npm install --save svgmap
import svgMap from 'svgmap';
import 'svgmap/dist/svgMap.min.css';

CDN

jsDelivr is a great CDN choice for svgMap:

<script src="https://cdn.jsdelivr.net/npm/svg-pan-zoom@3.6.1/dist/svg-pan-zoom.min.js"></script>
<script src="https://cdn.jsdelivr.net/gh/StephanWagner/svgMap@v2.7.1/dist/svgMap.min.js"></script>
<link href="https://cdn.jsdelivr.net/gh/StephanWagner/svgMap@v2.7.1/dist/svgMap.min.css" rel="stylesheet">

Usage

Create an HTML element where to show your map, then use JavaScript to initialize:

<div id="svgMap"></div>
new svgMap({
  targetElementID: 'svgMap',
  data: {
    data: {
      gdp: {
        name: 'GDP per capita',
        format: '{0} USD',
        thousandSeparator: ',',
        thresholdMax: 50000,
        thresholdMin: 1000
      },
      change: {
        name: 'Change to year before',
        format: '{0} %'
      }
    },
    applyData: 'gdp',
    values: {
      AF: {gdp: 587, change: 4.73},
      AL: {gdp: 4583, change: 11.09},
      DZ: {gdp: 4293, change: 10.01}
      // ...
    }
  }
});

This example code creates a world map with the GDP per capita and its change to the previous year:

Options

You can pass the following options into svgMap:

targetElementID string The ID of the element where the world map will render
Required
minZoom
maxZoom
float Minimal and maximal zoom level
Default: 1 for minZoom, 25 for maxZoom
initialZoom float Initial zoom level
Default: 1.06
initialPan object Initial pan on x and y axis, e.g. { x: 120, y: 60 }
Default: { x: 0, y: 0 }
zoomScaleSensitivity float Sensitivity when zooming
Default: 0.2
mouseWheelZoomEnabled boolean Enables or disables zooming with the scroll wheel
Default: true
mouseWheelZoomWithKey boolean Allow zooming only when one of the following keys is pressed: SHIFT, CONTROL, ALT, COMMAND, OPTION
Default: false
mouseWheelKeyMessage string The message when trying to scroll without a key
Default: 'Press the [ALT] key to zoom'
mouseWheelKeyMessageMac string The message when trying to scroll without a key on MacOS
Default: 'Press the [COMMAND] key to zoom'
colorMax
colorMin
colorNoData
string Color for highest value colorMax, lowest value colorMin and no data available colorNoData
Default: '#CC0033', '#FFE5D9', '#E2E2E2'
flagType 'emoji', 'image' The type of the flag in the tooltip
Default: 'image'
flagURL string The URL to the flags when using flag type 'image'. The placeholder {0} will get replaced with the lowercase ISO 3166-1 alpha-2 country code
Default: 'https://cdn.jsdelivr.net/gh/hjnilsson/country-flags@latest/svg/{0}.svg'
hideFlag boolean Hide the flag in tooltips
Default: false
noDataText string The text to be shown when no data is present
Default: 'No data available'
touchLink boolean Set to true to open the link (see data.values.link) on mobile devices, by default the tooltip will be shown.
onGetTooltip function Called when a tooltip is created to custimize the tooltip content (function (tooltipDiv, countryID, countryValues) { return 'Custom HTML'; })
countries: {
  // ...
}
Additional options specific to countries:
↳ EH boolean When set to false, Western Sahara (EH) will be combined with Morocco (MA)
Default: true
↳ Crimea 'UA', 'RU' Crimea: Set to 'RU' to make the Crimea part of Russia, by default it is part of the Ukraine
Default: 'UA'
data: {
  // ...
}
The chart data to use for coloring and to show in the tooltip. Use a unique data-id as key and provide following options as value:
↳ name string The name of the data, it will be shown in the tooltip
↳ format string The format for the data value, {0} will be replaced with the actual value
↳ thousandSeparator string The character to use as thousand separator
Default: ','
↳ thresholdMax number Maximal value to use for coloring calculations
↳ thresholdMin number Minimum value to use for coloring calculations
↳ applyData string The ID (key) of the data that will be used for coloring
↳ values object An object with the ISO 3166-1 alpha-2 country code as key and the chart data for each country as value
  ↳ color string Forces a color for this country
  ↳ link string An URL to redirect to when clicking the country
  ↳ linkTarget string The target of the link. By default the link will be opened in the same tab. Use '_blank' to open the link in a new tab
countryNames object An object with the ISO 3166-1 alpha-2 country code as key and the country name as value

Localize

Use the option countryNames to translate country names. In the folder demo/html/local you can find translations in following languages:
Arabic, Chinese, English, French, German, Hindi, Portuguese, Russian, Spanish, Urdu

To create your own translations, check out country-list by Saša Stamenković.

Attribution

If you need more detailed maps or more options for your data, there is a great open source project called datawrapper out there, with a lot more power than svgMap. Highmaps is also a great alternative.

svgMap uses svg-pan-zoom by Anders Riutta.

The country flag images are from country-flags by Hampus Nilsson.

Most data in the demos was taken from Wikipedia.