The Nuclear Timeline from Trinity to Pyongyang: The Spread of Nuclear Weapons
Author
Mardan Mirzaguliyev
Published
June 21, 2025
On June 13, Israel launched an attack on Iran, claiming concerns that the country is extremely close to developing nuclear weapons. While Iran’s nuclear program started in the 1960s, it’s worth noting that it is far from being the first nation to pursue or possess such weapons.
Nuclear weapons first emerged in the mid-20th century, beginning with the United States’ Trinity test in 1945. Since then, eight other countries have acquired nuclear weapons, most of them doing so sequentially throughout the last century. The only exception is North Korea, which joined the “atomic” club in 2006. The exact size of its arsenal remains unknown.
The visualization and table below trace the global timeline of nuclear weapon development — from the deserts of New Mexico to the mountains of North Korea — highlighting when each nation joined the atomic age.
Libararies
#|label: load necessary librarieslibrary(dplyr)
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
#|label: create lowercase column names for convenient manipulationnuclear_arsenals <-clean_names(nuclear_arsenals)
#|label: Plot object to combine with the background imagep <-ggplot(nuclear_arsenals, aes(x = first_test_year, y =reorder(country, first_test_year))) +geom_point(size =4, color ="darkred") +geom_text(aes(label = warheads_total), hjust =-0.3, size =3.5, color ="white") +labs(title ="The Nuclear Timeline from Trinity to Pyongyang",subtitle ="Estimated warheads per country (2025)",caption ="While Israel did not conduct any test it is estimated to have 90 warheads",x ="First Nuclear Test Year",y ="Country" ) +theme(panel.background =element_rect(fill =NA, color =NA),plot.background =element_rect(fill =NA, color =NA),panel.grid.major =element_blank(), panel.grid.minor =element_blank(),title =element_text(color ="white"),axis.text.x =element_text(color ="white"),axis.text.y =element_text(color ="white"),axis.title =element_text(color ="white") ) +scale_x_continuous(limits =c(1945, 2010), breaks =seq(1945, 2010, by =5))
#|:label: Timelineggdraw() +draw_grob(img_grob) +# Background imagedraw_plot(p) # Plot on top