Introduction

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.

Data Import and Preparation

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)

Figure 2: Top 10 Rice Producers, Most Recent Year (Bar Chart)

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

Figure 3: Yield Gains, 1990 vs. Present (Dumbbell Chart)

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

Figure 4: Global Rice Yield Map (Choropleth)

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

Figure 5: Fertilizer Use vs. Rice Yield (Scatter Plot)

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

Figure 6: Distribution of Country Yields, 1990 vs. Present (Density Plot)

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

Figure 7: Production Intensity by Country and Decade (Heatmap)

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

Figure 8: Production, Yield, and Area Harvested Over Time (Interactive, Animated Bubble Chart)

# 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

Summary

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.