Visualizing Climate Change in India

In this vignette, we show how to use varunayan to easily extract annual average temperature data for India and visualize the temperature changes over the period from 1941 to 2024.

Step 1: Download Temperature Data for India

We use varunayan.era5ify_geojson to download yearly average 2m temperature data for India, using a GeoJSON boundary file from a public URL.

import varunayan

df = varunayan.era5ify_geojson(
    request_id="temp_india_yearly",
    variables=["2m_temperature"],
    start_date="1941-1-1",
    end_date="2024-12-31",
    json_file="https://gist.githubusercontent.com/JaggeryArray/bf296307132e7d6127e28864c7bea5bf/raw/4bce03beea35d61a93007f54e52ba81f575a7feb/india.json",
    frequency="yearly",
)

============================================================
STARTING ERA5 SINGLE LEVEL PROCESSING
============================================================
Request ID: temp_india_yearly
Variables: ['2m_temperature']
Date Range: 1941-01-01 to 2024-12-31
Frequency: yearly
Resolution: 0.25°
GeoJSON File: C:\Users\ATHARV~1\AppData\Local\Temp\temp_india_yearly_temp_geojson.json


--- GeoJSON Mini Map ---

MINI MAP (68.18°W to 97.40°E, 7.97°S to 35.49°N):
┌─────────────────────────────────────────┐
│·········································│
│········■■■■■■■··························│
│··········■■■■■··························│
│·········■■■■■■■·························│
│·······■■■■■■■■■■························│
│····■■■■■■■■■■■■■■■■············■■■■■■■·│
│···■■■■■■■■■■■■■■■■■■■■■■■■■·■■■■■■■■····│
│····■■■■■■■■■■■■■■■■■■■■■■■■·····■■■■····│
│·■■■■■■■■■■■■■■■■■■■■■■■■■■■■···■■■······│
│··■■■■■■■■■■■■■■■■■■■■■■■■■■■············│
│·······■■■■■■■■■■■■■■■■■■■···············│
│·······■■■■■■■■■■■■■■■■··················│
│·······■■■■■■■■■■■■■·····················│
│········■■■■■■■■■························│
│·········■■■■■■■■························│
│··········■■■■■■■························│
│···········■■■■■·························│
│············■■■··························│
│·········································│
└─────────────────────────────────────────┘
  = Inside the shape
 · = Outside the shape

Saving files to output directory: temp_india_yearly_output
  Saved final data to: temp_india_yearly_output\temp_india_yearly_yearly_data.csv
  Saved unique coordinates to: temp_india_yearly_output\temp_india_yearly_unique_latlongs.csv
  Saved raw data to: temp_india_yearly_output\temp_india_yearly_raw_data.csv

============================================================
PROCESSING COMPLETE
============================================================

RESULTS SUMMARY:
----------------------------------------
Variables processed: 1
Time period:         1941-01-01 to 2024-12-31
Final output shape:  (84, 2)
Total complete processing time: 447.03 seconds

First 5 rows of aggregated data:
          t2m  year
0  296.386200  1941
1  296.234344  1942
2  295.743408  1943
3  296.361176  1944
4  296.111603  1945

============================================================
ERA5 SINGLE LEVEL PROCESSING COMPLETED SUCCESSFULLY
============================================================

Step 2: Compute Deviation from Long-Term Mean

We calculate the deviation of each year’s average temperature from the long-term mean. This helps us understand how each year compares to the overall average.

mean_t2m = df["t2m"].mean()

df["dev"] = df["t2m"] - mean_t2m

df.head()
t2m year dev
0 296.386200 1941 -0.202301
1 296.234344 1942 -0.354156
2 295.743408 1943 -0.845093
3 296.361176 1944 -0.227325
4 296.111603 1945 -0.476898

Step 3: Set Up Matplotlib Styling

We configure Matplotlib to ensure consistent, high-resolution plots with a clean visual style. This setup improves readability, especially in documentation.

import matplotlib.cm as cm
import matplotlib.colors as mcolors
import matplotlib.pyplot as plt


def setup_matplotlib():
    plt.rcParams["figure.dpi"] = 300
    plt.rcParams["savefig.dpi"] = 300
    plt.rcParams["font.family"] = "sans-serif"
    plt.rcParams["font.sans-serif"] = ["Arial"]
    plt.rcParams["axes.labelweight"] = "normal"

    plt.rcParams["mathtext.fontset"] = "custom"
    plt.rcParams["mathtext.rm"] = "Arial"
    plt.rcParams["mathtext.it"] = "Arial:italic"
    plt.rcParams["mathtext.bf"] = "Arial:bold"


setup_matplotlib()

Step 4: Normalize Deviation Values

We normalize the temperature deviation values so we can map them to a color scale for the bar chart.

norm = mcolors.Normalize(vmin=df["dev"].min(), vmax=df["dev"].max())

Step 5: Set Color Map

We use the coolwarm color map to represent deviation: cool colors for below-average years and warm colors for above-average years.

cmap = plt.colormaps["coolwarm"]
colors = cmap(norm(df["dev"]))

Step 6: Plot Temperature Deviation Over Time

We create a color-coded bar plot of yearly temperature deviations. A colorbar is added to indicate the scale of deviation from the mean.

fig, ax = plt.subplots(figsize=(14, 6))
bars = ax.bar(df["year"], df["dev"], color=colors)

sm = cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array(df["dev"].values)

cbar = fig.colorbar(sm, ax=ax)
cbar.set_label("Deviation")

ax.set_xlabel("Year")
ax.set_ylabel("Deviation")
ax.set_title("Temperature change in India")

plt.tight_layout()
plt.show()
../_images/db2bafe0586543cd339694a2ae14b51b412a46870969bfc8a89ee5d0dae1bd9d.png

This plot shows the yearly deviation in average temperature across India from the long-term mean (1941–2024).
Bars above zero indicate warmer-than-average years, while bars below zero indicate cooler-than-average years.
The color gradient reinforces this — with warm tones for hotter years and cool tones for colder years.

Conclusion

This example demonstrates how varunayan can be used to easily access and visualize historical climate data for a specific region — in this case, India’s average temperature from 1941 to 2024. The visualization clearly illustrates how India’s average annual temperature has changed over the last 80+ years.

  • There is a noticeable upward shift in temperature deviations over time, with recent decades showing more frequent and intense warmer-than-average years.

  • The use of color gradients helps visually track how the climate signal has intensified over time.

By combining climate data extracted using varunayan with simple processing and visualization, we gain a compelling and accessible picture of India’s changing climate — one that is both data-driven and intuitive.