How to Map the World's Volcanoes by Type and Tectonic Setting
On this page
Problem statement
Most of the world's volcanoes stand where one tectonic plate sinks beneath another; others sit on rifts where plates pull apart, or far from any boundary over a hot spot. Their shapes follow: steep stratovolcanoes above subduction zones, broad shields and fissures on rifts and hot spots. The Smithsonian's volcano table records both the primary volcano type and the tectonic setting, so the pattern can be mapped and counted. Two things need cleaning first: the type column spells the same type in singular and plural, and the setting column packs the plate setting and the crust thickness into one string. This page cleans both and maps the 1,214 Holocene volcanoes.
Quick answer
Fold the plural spellings into one type, split the setting at the slash, and count:
vol["kind"] = vol.Primary_Volcano_Type.str.replace(r"\((?:s|es)\)$", "", regex=True).str.strip()
vol[["setting", "crust"]] = vol.Tectonic_Setting.str.split(" / ", n=1, expand=True)
print(vol.kind.value_counts().head(8).to_string())
print(vol.setting.value_counts(dropna=False).to_string())
kind
Stratovolcano 658
Volcanic field 138
Shield 110
Caldera 85
Complex 55
Fissure vent 52
Pyroclastic cone 39
Lava dome 31
setting
Subduction zone 838
Rift zone 221
Intraplate 149
NaN 6
Once the plural spellings are folded together, 658 of the 1,214 volcanoes are stratovolcanoes, the steep cones built of alternating lava and ash, followed by 138 volcanic fields, 110 shields and 85 calderas. By setting, 838 are on subduction zones, 221 on rifts and 149 within plates. Six have no setting recorded.
Cleaning the two columns
1. Types spelled twice
print(vol.Primary_Volcano_Type.value_counts().loc[lambda s: s.index.str.startswith(("Stratovolcano", "Shield", "Fissure", "Lava dome", "Pyroclastic cone"))].to_string())
print(f"type values before: {vol.Primary_Volcano_Type.nunique()}; after: {vol.kind.nunique()}")
Primary_Volcano_Type
Stratovolcano 551
Stratovolcano(es) 107
Shield 97
Fissure vent(s) 33
Pyroclastic cone(s) 28
Lava dome(s) 25
Fissure vent 19
Shield(s) 13
Pyroclastic cone 11
Lava dome 6
Shield(pyroclastic) 3
Stratovolcano? 2
type values before: 27; after: 18
The raw column spells many types twice, once for a single cone and once with "(s)" or "(es)" for several: 551 "Stratovolcano" and 107 "Stratovolcano(es)". Removing the suffix takes the column from 27 values to 18. "Shield(pyroclastic)" and "Stratovolcano?" are kept apart, because they say something different: a shield built of pyroclastic material, and a type the program is not sure of.
2. Setting and crust
print(pd.crosstab(vol.crust.str.replace(r" \(.*\)$", "", regex=True), vol.setting).to_string())
setting Intraplate Rift zone Subduction zone
crust
Continental crust 114 79 581
Crustal thickness unknown 0 0 70
Intermediate crust 5 40 65
Oceanic crust 30 102 122
The second half of the setting string is the thickness of the crust beneath the volcano: continental (over 25 km), intermediate (15 to 25 km) or oceanic (under 15 km). Subduction-zone volcanoes stand mostly on continental crust, 581 of 838, the Andes, Japan, Indonesia and the Cascades. Rift volcanoes stand mostly on oceanic crust, 102 of 221, like Iceland and the Azores on the Mid-Atlantic Ridge.
3. Type by setting
t = pd.crosstab(vol.kind, vol.setting)
print(t.loc[["Stratovolcano", "Shield", "Volcanic field", "Caldera", "Fissure vent"]].to_string())
setting Intraplate Rift zone Subduction zone
kind
Stratovolcano 33 62 562
Shield 27 52 29
Volcanic field 61 32 45
Caldera 2 8 75
Fissure vent 7 41 4
Type follows setting. 562 of the 658 stratovolcanoes are on subduction zones, where the magma is viscous and gas-rich, and 75 of the 85 calderas, the craters left when a large explosive eruption empties the magma chamber. Fissure vents, where runny basalt pours out of long cracks, are almost all on rifts: 41 of 52.
Below the sea and on the map
The data used on this page
The Smithsonian Institution Global Volcanism Program's Volcanoes of the World database (version 5.3 is cited as doi:10.5479/si.GVP.VOTW5-2025.5.3): its Holocene volcano and eruption tables, read from the program's WFS service on 19 October 2026 and saved on this site, because the database is edited as eruptions are reported.
from pathlib import Path
import zipfile
import geopandas as gpd
import numpy as np
import pandas as pd
import requests
Path("data").mkdir(exist_ok=True)
# Smithsonian Global Volcanism Program, Volcanoes of the World: Holocene volcanoes, Holocene eruptions and Pleistocene
# volcanoes as GeoJSON from its WFS service, with Natural Earth's populated places and 1:110m countries.
# Saved 19 October 2026, because the database is edited as eruptions are reported.
# Live: https://webservices.volcano.si.edu/geoserver/GVP-VOTW/ows?service=WFS&version=2.0.0&request=GetFeature
# &outputFormat=json&typeName=GVP-VOTW:Smithsonian_VOTW_Holocene_Volcanoes (and ..._Holocene_Eruptions)
ARCHIVE = "gvp-votw-2026-10-19.zip"
if not Path(f"data/{ARCHIVE}").exists():
Path(f"data/{ARCHIVE}").write_bytes(requests.get(f"https://data.spatialworkflow.io/{ARCHIVE}", timeout=600).content)
Z = zipfile.ZipFile(f"data/{ARCHIVE}")
vol = gpd.read_file(Z.open("Smithsonian_VOTW_Holocene_Volcanoes.json"))
eru = gpd.read_file(Z.open("Smithsonian_VOTW_Holocene_Eruptions.json"))
print(f"Volcanoes of the World: {len(vol):,} Holocene volcanoes, {len(eru):,} eruptions")
Volcanoes of the World: 1,214 Holocene volcanoes, 11,089 eruptions
Example 1: submarine volcanoes
sub = vol[vol.Elevation < 0]
print(f"summits below sea level: {len(sub)}; deepest {sub.Elevation.min():,.0f} m ({sub.loc[sub.Elevation.idxmin(), 'Volcano_Name']}); highest summit {vol.Elevation.max():,.0f} m ({vol.loc[vol.Elevation.idxmax(), 'Volcano_Name']})")
print(sub.setting.value_counts().to_string())
summits below sea level: 112; deepest -5,700 m (Udintsev Transform); highest summit 6,879 m (Ojos del Salado, Nevados)
setting
Subduction zone 63
Rift zone 30
Intraplate 15
112 volcanoes have their summit below sea level, the deepest at 5,700 m, Udintsev Transform in the far South Pacific, while the highest summit is Ojos del Salado on the Chile-Argentina border at 6,879 m. More of the submarine volcanoes are on subduction zones, 63, than on the mid-ocean rifts, 30: 50 of those 63 are in the northwestern Pacific and Tonga-Kermadec arcs, which have many seamounts.
Example 2: the map
Path("data/ne_110m_admin_0_countries.zip").write_bytes(Z.read("ne_110m_admin_0_countries.zip"))
world = gpd.read_file("data/ne_110m_admin_0_countries.zip")
ax = world.to_crs("+proj=robin").plot(color="#e5e7eb", figsize=(12, 6))
vol.to_crs("+proj=robin").plot(ax=ax, column="setting", markersize=4, legend=True)
ax.set_axis_off()
print(f"countries drawn: {len(world)}")
countries drawn: 177
Drawn in the Robinson projection, the subduction volcanoes outline the Pacific, the rift volcanoes run through Iceland, East Africa and the mid-ocean ridges, and the intraplate volcanoes stand alone in places like Hawaii, the Canaries and the volcanic fields of Arabia.
Internal links
- Reading the database β the volcano table
- Earthquakes and plate boundaries β the same boundaries traced by earthquakes
- Cities near volcanoes β who lives beside the subduction-zone volcanoes
- What the records hold β evidence behind each volcano