Rice feeds more people than any other crop on earth, and few countries depend on it as heavily as Bangladesh. This report visualizes six decades (1961-present) of rice production, yield, and fertilizer-use data for the world’s major rice-producing nations – Bangladesh, India, China, Vietnam, Indonesia, and Thailand – sourced from FAOSTAT (via Our World in Data’s cleaned, harmonized CSVs). The goal is to show how much of the last 60 years of rice output growth has come from genetic and agronomic yield gains (breeding better varieties, better management) rather than simply farming more land, and how Bangladesh’s own trajectory compares to its regional peers.
rice_production_raw <- read_csv(
"https://ourworldindata.org/grapher/rice-production.csv?v=1&csvType=full&useColumnShortNames=false"
)
rice_yield_raw <- read_csv(
"https://ourworldindata.org/grapher/rice-yields.csv?v=1&csvType=full&useColumnShortNames=false"
)
fertilizer_raw <- read_csv(
"https://ourworldindata.org/grapher/fertilizer-use-per-hectare-of-cropland.csv?v=1&csvType=full&useColumnShortNames=false"
)
# Standardize column names by position (Entity, Code, Year, <value>)
# so the code is robust to any small label differences upstream.
rice_production <- rice_production_raw %>%
rename(country = 1, iso3 = 2, year = 3, production_tonnes = 4) %>%
filter(!is.na(iso3))
rice_yield <- rice_yield_raw %>%
rename(country = 1, iso3 = 2, year = 3, yield_t_ha = 4) %>%
filter(!is.na(iso3))
fertilizer <- fertilizer_raw %>%
rename(country = 1, iso3 = 2, year = 3, fertilizer_kg_ha = 4) %>%
filter(!is.na(iso3))
focus_countries <- c("Bangladesh", "India", "China", "Vietnam", "Indonesia", "Thailand")
latest_year <- max(rice_yield$year)
rice_yield_focus <- rice_yield %>% filter(country %in% focus_countries)
rice_production_focus <- rice_production %>% filter(country %in% focus_countries)
p1 <- ggplot(rice_yield_focus, aes(x = year, y = yield_t_ha, color = country)) +
geom_line(linewidth = 1) +
scale_color_brewer(palette = "Set2") +
labs(
title = "Rice Yield Has More Than Tripled Since 1961 Across South & Southeast Asia",
subtitle = "Bangladesh's yield gains have tracked closely with its regional peers",
x = "Year",
y = "Yield (tonnes per hectare)",
color = "Country"
) +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")
p1
top10_production <- rice_production %>%
filter(year == latest_year) %>%
arrange(desc(production_tonnes)) %>%
slice_head(n = 10) %>%
mutate(country = fct_reorder(country, production_tonnes))
p2 <- ggplot(top10_production, aes(x = country, y = production_tonnes / 1e6, fill = country == "Bangladesh")) +
geom_col() +
coord_flip() +
scale_fill_manual(values = c("TRUE" = "#d95f02", "FALSE" = "#7570b3"), guide = "none") +
labs(
title = paste("Top 10 Rice-Producing Countries,", latest_year),
subtitle = "China and India together account for roughly half of global rice output",
x = NULL,
y = "Production (million tonnes)"
) +
theme_minimal(base_size = 13)
p2
dumbbell_dat <- rice_yield_focus %>%
filter(year %in% c(1990, latest_year)) %>%
select(country, year, yield_t_ha) %>%
pivot_wider(names_from = year, values_from = yield_t_ha, names_prefix = "y_") %>%
mutate(country = fct_reorder(country, .data[[paste0("y_", latest_year)]]))
y1990_col <- "y_1990"
ylatest_col <- paste0("y_", latest_year)
p3 <- ggplot(dumbbell_dat, aes(y = country)) +
geom_segment(aes(x = .data[[y1990_col]], xend = .data[[ylatest_col]], yend = country), linewidth = 1.2, color = "grey70") +
geom_point(aes(x = .data[[y1990_col]]), size = 4, color = "#fc8d62") +
geom_point(aes(x = .data[[ylatest_col]]), size = 4, color = "#66c2a5") +
labs(
title = paste("Rice Yield Improvement, 1990 to", latest_year),
subtitle = "Orange = 1990 yield | Green = most recent yield",
x = "Yield (tonnes per hectare)",
y = NULL
) +
theme_minimal(base_size = 13)
p3
world_sf <- ne_countries(scale = "medium", returnclass = "sf")
yield_latest <- rice_yield %>%
filter(year == latest_year) %>%
select(iso3, yield_t_ha)
world_yield <- world_sf %>%
left_join(yield_latest, by = c("iso_a3" = "iso3"))
p4 <- ggplot(world_yield) +
geom_sf(aes(fill = yield_t_ha), color = "grey85", linewidth = 0.1) +
scale_fill_viridis_c(option = "viridis", na.value = "grey92", name = "t/ha") +
labs(
title = paste("Global Rice Yield by Country,", latest_year),
subtitle = "South & Southeast Asia and parts of East Asia lead the world in rice productivity"
) +
theme_void(base_size = 13) +
theme(legend.position = "right")
p4
fert_yield <- rice_yield %>%
filter(year == latest_year) %>%
inner_join(fertilizer %>% filter(year == latest_year) %>% select(iso3, fertilizer_kg_ha), by = "iso3") %>%
filter(!is.na(fertilizer_kg_ha), !is.na(yield_t_ha))
p5 <- ggplot(fert_yield, aes(x = fertilizer_kg_ha, y = yield_t_ha)) +
geom_point(alpha = 0.5, color = "#1b9e77") +
geom_point(data = fert_yield %>% filter(country %in% focus_countries), color = "#d95f02", size = 3) +
geom_smooth(method = "lm", se = FALSE, color = "grey40", linetype = "dashed") +
ggrepel::geom_text_repel(data = fert_yield %>% filter(country %in% focus_countries), aes(label = country), size = 3.5) +
labs(
title = "Higher Fertilizer Use Is Associated With Higher Rice Yield",
subtitle = paste0("Each point is a country, ", latest_year, "; highlighted countries are this project's regional focus"),
x = "Fertilizer use (kg per hectare of cropland)",
y = "Rice yield (tonnes per hectare)"
) +
theme_minimal(base_size = 13)
p5
density_dat <- rice_yield %>%
filter(year %in% c(1990, latest_year)) %>%
mutate(year = factor(year))
p6 <- ggplot(density_dat, aes(x = yield_t_ha, fill = year)) +
geom_density(alpha = 0.55, color = NA) +
scale_fill_manual(values = c("#fc8d62", "#66c2a5")) +
labs(
title = "The Global Distribution of Rice Yields Has Shifted Sharply Upward",
subtitle = paste("Country-level yield distribution, 1990 vs.", latest_year),
x = "Yield (tonnes per hectare)",
y = "Density",
fill = "Year"
) +
theme_minimal(base_size = 13)
p6
heatmap_dat <- rice_production %>%
filter(country %in% (rice_production %>% filter(year == latest_year) %>% arrange(desc(production_tonnes)) %>% slice_head(n = 10) %>% pull(country))) %>%
mutate(decade = paste0(floor(year / 10) * 10, "s")) %>%
group_by(country, decade) %>%
summarize(avg_production = mean(production_tonnes, na.rm = TRUE), .groups = "drop") %>%
mutate(country = fct_reorder(country, avg_production, .fun = max))
p7 <- ggplot(heatmap_dat, aes(x = decade, y = country, fill = avg_production / 1e6)) +
geom_tile(color = "white") +
scale_fill_viridis_c(option = "magma", name = "Million\ntonnes") +
labs(
title = "Decade-Average Rice Production, Top 10 Producers",
subtitle = "1961-1969 through the present decade",
x = "Decade",
y = NULL
) +
theme_minimal(base_size = 13) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
p7
# Area harvested is derived directly from production and yield
# (area = production / yield), avoiding a separate download.
bubble_dat <- rice_production %>%
filter(country %in% focus_countries) %>%
inner_join(rice_yield %>% select(country, year, yield_t_ha), by = c("country", "year")) %>%
mutate(area_ha = production_tonnes / yield_t_ha) %>%
filter(year %% 5 == 0) # every 5th year keeps the animation smooth
p8 <- plot_ly(
bubble_dat,
x = ~yield_t_ha,
y = ~production_tonnes / 1e6,
size = ~area_ha,
color = ~country,
frame = ~year,
text = ~paste0(country, "<br>Year: ", year, "<br>Yield: ", round(yield_t_ha, 2), " t/ha"),
hoverinfo = "text",
type = "scatter",
mode = "markers",
sizes = c(20, 90)
) %>%
layout(
title = "Rice Production vs. Yield Over Time, 1961-Present (Bubble Size = Area Harvested)",
xaxis = list(title = "Yield (tonnes per hectare)"),
yaxis = list(title = "Production (million tonnes)")
)
p8
Across all eight figures, the consistent story is that rice output growth in this region has been driven overwhelmingly by yield gains rather than land expansion – visible in Figures 1, 3, and 8, where production rises even as area harvested stays comparatively flat. Bangladesh (Figures 1-3, 8) has closed much of the gap with its larger neighbors since 1990, though it still trails China and Vietnam in absolute yield. Figure 5 suggests fertilizer intensification is one contributor to that gain, though genetics and breeding – improved variety adoption, disease resistance, shorter-duration cultivars – are not directly observable in this dataset and are a natural extension for future work.