Eyemap Archive

Pre-computed maps between the hexagonal lattice of the Drosophila compound eye and the 3D viewing direction of each ommatidium/optic-lobe column — ready to browse, inspect in 3D, and download.

What is an "eyemap"?

Each ommatidium (facet) of the fly's compound eye corresponds to a column of neurons running through the optic lobe. An eyemap records, for every column, its position in a hexagonal lattice ( p, q) alongside the 3D direction that column looks out into the world — a unit vector (x, y, z) on the sphere of gaze directions, equivalently given as spherical angles (theta, phi). Some datasets also link each column to a specific identified neuron (rootid) in a connectome reconstruction.

ColumnMeaning
p, qHexagonal lattice coordinates of the column (oblique axes)
x, y, zUnit viewing-direction vector — a point on the unit sphere (+x forward, +y left, +z up/dorsal)
theta, phiThe same direction as spherical angles, in degrees
rootidConnectome neuron ID at that column (only present for some datasets)

This archive currently hosts eyemaps registered to the FAFB/FlyWire and male CNS (maleCNS) connectomes, including a Dorsal Rim Area (DRA) variant for the polarized-light-sensing region of the eye. See Browse for the full list with per-dataset details.

Using the site

Browse lists every available eyemap with its source connectome, date, hemisphere coverage, and point count. From there, open the 3D Viewer to rotate a dataset as a 3D scatter of viewing directions, or switch to a flattened Mollweide or Mercator projection (the same views used in downstream analysis code). Each dataset card also links directly to its raw .xlsx/.rda files plus plain CSV/JSON exports.

Programmatic download

manifest.json is a machine-readable index of every dataset and its stable download URLs — fetch it first, then pull whichever files you need without scraping the site.

# Python
import requests, pandas as pd

manifest = requests.get(
    "https://artxz.github.io/eyemap-archive/manifest.json"
).json()

ds = next(d for d in manifest["datasets"] if d["id"] == "eyemap_783_20240701")
url = ds["hemispheres"]["left"]["files"]["csv"]
df = pd.read_csv("https://artxz.github.io/eyemap-archive/" + url)
# R
manifest <- jsonlite::fromJSON("https://artxz.github.io/eyemap-archive/manifest.json")
ds <- manifest$datasets[manifest$datasets$id == "eyemap_783_20240701", ]
df <- read.csv(paste0("https://artxz.github.io/eyemap-archive/", ds$hemispheres$left$files$csv))

Citing this data

Zhao et al. 2022, bioRxiv
Nern et al. 2025, Nature