This report reviews electric-vehicle adoption in India using published vehicle-registration statistics and international electric-car sales indicators. It includes eight visualizations across multiple chart types and an interactive state comparison. The sources show growth in India’s electric-car market between 2024 and 2025, substantial variation in state registration totals, and a strong concentration in electric two-wheelers in the selected PM E-DRIVE dashboard snapshot.
Important interpretation note: The sources measure different things. State registrations are a VAHAN-based FY 2023–24 top-10 snapshot; car sales and sales share are calendar-year estimates for 2024–2025; PM E-DRIVE segment figures are scheme-associated registrations, not total EV registrations across India. Do not combine these series as if they were one consistent dataset.
The 2024 India values are approximate because the IEA describes sales as “nearly 100,000” and the share as “approaching 2%.” The 2025 IEA figures are 165,000 electric-car sales and nearly 4% of new car sales. State figures are the top 10 published values, not a complete state-level extract.
ggplot(india_sales, aes(x = year, y = electric_car_sales_approx)) +
geom_line(linewidth = 1.2, color = "#2878B5") +
geom_point(size = 3, color = "#2878B5") +
geom_text(aes(label = comma(electric_car_sales_approx)), vjust = 1.6, size = 4) +
scale_x_continuous(breaks = c(2024, 2025)) +
scale_y_continuous(labels = label_number(scale_cut = cut_short_scale()),
expand = expansion(mult = c(0.08, 0.22))) +
labs(title = "Electric car sales in India increased from about 100,000 to 165,000",
x = "Calendar year", y = "Electric car sales (approximate vehicles)",
caption = "Source: IEA, Global EV Outlook 2026. 2024 figure is approximate.") +
theme_minimal(base_size = 12)
state_ranked <- state_ev |> arrange(registrations)
ggplot(state_ranked, aes(x = registrations, y = fct_reorder(state, registrations))) +
geom_col(fill = "#2878B5") +
geom_text(aes(label = comma(registrations)), hjust = -0.12, size = 3.2) +
scale_x_continuous(labels = comma, expand = expansion(mult = c(0, .18))) +
labs(title = "Uttar Pradesh led the top 10 states in EV registrations in FY 2023–24",
x = "EV registrations (vehicles)", y = "State / UT",
caption = "Source: BEE India Energy Scenario Report 2024, citing VAHAN. Top 10 only.") +
theme_minimal(base_size = 11)
state_ev |>
mutate(share = registrations / sum(registrations),
label = if_else(share >= 0.06, percent(share, accuracy = 0.1), "")) |>
ggplot(aes(x = 2, y = registrations, fill = state)) +
geom_col(width = 1, color = "white") +
geom_text(aes(label = label), position = position_stack(vjust = 0.5),
color = "white", fontface = "bold", size = 3.5) +
coord_polar(theta = "y") +
xlim(.5, 2.5) +
labs(title = "Contribution of states to registrations within the top-10 group",
fill = "State / UT",
caption = "Percentages are calculated only within the ten states shown; slices below 6% are unlabeled to avoid clutter.") +
theme_void(base_size = 11) +
theme(legend.position = "right")
pareto <- state_ev |>
arrange(desc(registrations)) |>
mutate(rank = row_number(),
cumulative_share = cumsum(registrations) / sum(registrations) * 100)
ggplot(pareto, aes(x = reorder(state, -registrations))) +
geom_col(aes(y = registrations), fill = "#2878B5") +
geom_line(aes(y = cumulative_share * max(registrations) / 100, group = 1),
color = "#D95F02", linewidth = 1.1) +
geom_point(aes(y = cumulative_share * max(registrations) / 100), color = "#D95F02", size = 2) +
scale_y_continuous(labels = comma,
name = "EV registrations (vehicles)",
sec.axis = sec_axis(~ . / max(pareto$registrations) * 100,
name = "Cumulative share of top-10 registrations (%)")) +
labs(title = "Ranked state registrations and cumulative contribution",
x = "State / UT (ranked)",
caption = "Cumulative share is calculated within the selected top-10 group.") +
theme_minimal(base_size = 10) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplot(segments, aes(x = registrations_total, y = fct_reorder(segment, registrations_total))) +
geom_col(fill = "#238B45") +
geom_text(aes(label = comma(registrations_total)), hjust = -0.1, size = 3.5) +
scale_x_log10(labels = label_number(), expand = expansion(mult = c(0.05, .22))) +
labs(title = "The PM E-DRIVE dashboard snapshot is dominated by electric two-wheelers",
x = "Reported registrations, including temporary registrations (log scale)",
y = "Vehicle segment",
caption = "Scheme-associated registrations only; not total EV registrations in India.") +
theme_minimal(base_size = 11)
Hover over bars to see the state and registration count.
state_ev |>
arrange(registrations) |>
plot_ly(x = ~registrations, y = ~state, type = "bar", orientation = "h",
text = ~comma(registrations), hovertemplate = "%{y}<br>Registrations: %{x:,}<extra></extra>") |>
layout(title = "Explore EV registrations across the top 10 states (FY 2023–24)",
xaxis = list(title = "EV registrations (vehicles)"),
yaxis = list(title = "State / UT"),
margin = list(l = 150))
The available evidence points to a growing electric-car market in India and significant geographic and segment-level variation in EV adoption. Uttar Pradesh, Maharashtra, and Karnataka were the leading states in the cited FY 2023–24 top-10 registration list, while the PM E-DRIVE snapshot is dominated by electric two-wheelers. India’s electric-car sales share nevertheless remained below the global average in 2025. A future extension should use a complete state-by-year VAHAN extract and consistently defined vehicle categories to examine state-level adoption rates and longer-term changes.
Note: This report presents a descriptive analysis of electric vehicle adoption using publicly available data. Findings should be interpreted in the context of the data sources, reporting periods, and limitations discussed in the report.