scroll · 2026-05-13 · ~5 min · live data

The Narcan Map

Two readings of Philadelphia's overdose crisis: the 872 confirmed deaths in 2024, and the 12,922 Narcan kits the Opioid Response Unit distributed in the same year. The PFD's published YoY trend tells you direction; only the raw counts tell you scale.

In 2024, Philadelphia recorded 872 overdose deaths across 48 reporting ZIP codes. The map shades each ZIP by its 2024 death count; 19134 alone recorded 174 deaths — more than 19124 (82), the second-busiest ZIP.

20 ZIPs report zero, but the upstream dataset notes those are actually fewer than ten — the city suppresses small counts for privacy. The white spaces on the map mean "very few," not "none."

Next: same map, different layer — the Narcan kits the city's Opioid Response Unit distributes. The shading will shift to marigold.

The marigold shading shows 12,922 Narcan kits the city's Opioid Response Unit distributed in 2024 — the canvassing side of the crisis. 19141 received 2,884 kits, the most of any ZIP.

The two maps don't overlap the way you'd expect. The deadliest ZIP — 19134 with 174 deaths — shows zero kits in this layer. That's because this dataset records ORU canvassing distribution specifically, not every Narcan administration in the city. The ORU targets selected ZIPs door-to-door; the kits map shows where that program reached, not where naloxone got used by EMS, police, or community members. Two views of the same crisis, from very different angles.

Counts settle a question of magnitude; trajectory settles a question of velocity. Next, the cobalt shading fills in year-over-year change.

PFD also publishes year-over-year percent change in Narcan administrations per ZIP — the cobalt shading on the map averages 2021-22 through 2023-24 for each ZIP into a single "rising or falling" signal.

This layer is honestly limited. The published values are percent change, not raw administrations, so a ZIP that went from 1 administration to 2 reads the same as a ZIP that went from 1,000 to 2,000. We clamp outliers (the source includes a few unrealistic figures like -200%) and average across years to get a coarse direction. The magnitude beats above are the load-bearing signal; this map just adds a hint of where things are getting worse.

Where deaths are both large and intensifying, the brick map will return and pick out the convergence.

Where the crisis is both large and intensifying, the ZIPs at the intersection are highlighted at full saturation. There are 4 of them — ZIPs with at least ten 2024 deaths AND a trajectory average of at least +10% across the three year-over-year pairs 2021→2022, 2022→2023, 2023→2024 (each clamped to [-100, 200]). The list, in order of 2024 deaths: 19134, 19124, 19125, 19135.

These are the ZIPs where the next few years of public-health attention will matter most. Naloxone availability is necessary; it isn't sufficient. The Narcan map shows where the emergency interventions land. It does not yet show what's working upstream.

2024 overdose deaths · 872 citywide · ZIPs with 0 are ≤10 (suppressed)

View underlying data

Top 10 ZIPs by 2024 overdose deaths, with their 2024 Narcan-kit distribution and 2021–2024 avg YoY trajectory in Narcan administrations.

ZIPDeaths (2024)Narcan kits (2024)EngagementsTrajectory (avg YoY %)
191341740023%
19124820014%
191325700-2%
1913356009%
1914052005%
19143341,358749-16%
19104321,912855-4%
19125300019%
191392800-4%
191212700-19%

Data Sources

Primary datasets: overdose_deaths_oru_canvassing_zipcode (raw 2024 deaths + Narcan kits + engagements per zip) and stat360_narcan_administrations (year-over-year percent change in Narcan administrations). Both ArcGIS Feature Services. Frozen at deploy (2026-05-13).

Queries: overdoseRawUrl() for the raw deaths / kits / engagements layer (one row per zip per year via latestPerZip()) and narcanPctChangeUrl() for the trajectory ratios. Both URL builders defined in src/lib/data/datasets/philly-fire.ts. Convergence list comes from filtering the joined layer to deaths >= 10 && trajectory >= 10; trajectory is the mean of averageTrajectory()'s clamped 2021→22 / 22→23 / 23→24 pairs.

Methodology & caveats: The raw-counts dataset notes that ZIPs reporting 0 deaths are actually <10, suppressed for privacy. The pct-change dataset publishes ratios only — the trajectory map averages three year-pairs with each clamped to [-100, 200] before averaging, so a single anomalous reading doesn't dominate. Pct-change without raw baselines tells you direction, not scale; pairing the two layers is the closest we can get to honest in this data.