MapBees logoMapBees

Blog

How a Cross two (bivariate) map works, explained simply

A Cross two map (the field calls it a bivariate map) shades every hex by two measures at once. Using residential plus outbuilding volume vs. total population in New York City, here is how to read the colors, the units, the real band edges under the legend, and the classification the map chose for each axis - in plain language.

Beginner friendlyTwo measuresMap literacy
ByTinkal Gogoi(LinkedIn profile, opens in a new tab)June 18, 2026Updated October 21, 202612 min read

One map, two answers at once

Most maps color each hex — one hexagon on the map, about 350 m across (roughly 0.1 km²) — by a single thing: population, say, or how built-up it is. A Cross two map (the field calls it a bivariate map) is cleverer: it shades every hex by two measures at the same time, so you can see how they line up across a whole city in one glance.

In MapBees you pick Cross two in the map-type picker. You pick a measure — or several, added together — for the left-to-right direction (the X axis) and another for the up-and-down direction (the Y axis), and every hex gets a color that says where it sits on both at once.

To see exactly which measures are supported by city and country, open the supported measures catalog.

A real bivariate map of New York City. X = Residential + Outbuilding volume (m³), Y = total population. Each hex's color blends where it falls on both measures, and the legend prints the numbers those colors stand for — plus the cut it chose, and what is wrong with it.

Our example: buildings vs. people in New York

The screenshots use New York City with two everyday questions stacked together:

  • XResidential + Outbuilding volume (the left-to-right axis) — how much building sits in that hex once you count homes and the small buildings that serve them — sheds, carports, garden houses and open-sided roofs — measured in cubic meters (m³). Two boxes ticked in one picker; MapBees adds them up.
  • YTotal population (the up-and-down axis) — an estimate of how many people live there, from the census.

Put together, the map answers a much richer question than either could alone: where are there lots of homes and lots of people, where is there a lot of building but few residents, and where do people live without much built structure around them?

Adding the outbuildings to the homes is a small change that matters in a city like New York: on the edges of the outer boroughs a plot's shed or carport is a real part of what is built there, and leaving it out quietly understates those hexes. (Garages are already in Residential: that is where Overture Maps files them.)

One more box is worth knowing about: No type recorded. It holds the buildings Overture Maps gives no building type, so they could be homes, shops, offices or anything else, and the picker shows each type's share of the city's building volume beside it. When the screenshots here were taken, those buildings were still counted under Outbuilding, so the numbers in this post include them. Where a city lists No type recorded as its own box, tick it too to sum what this axis summed - the ready-made question Buildings against people in the Question Library does exactly that - and read the axis as homes plus buildings whose type nobody recorded, not as homes alone.

An axis doesn't have to be just one measure

That X axis is two measures, not one — and that is a normal thing to do. Each picker opens as a searchable tree — the same group-and-category layout used throughout MapBees — instead of one long dropdown. Type to filter, or expand a group (Building volume, Places, Population & age, Affluence, Accessibility) and drill into a category to find the exact measure you want.

Every row is a checkbox, not a single choice. Tick more than one measure and MapBees adds their per-hex values together before ranking that axis — so “Residential” and “Outbuilding” (both measured in m³) become one combined built-volume axis without leaving the picker. The trigger then reads “2 measures summed.”

Find it fast

Start typing in the picker and matching groups and categories expand automatically — no need to remember which group a measure lives in.

Stack same-unit measures

Check as many measures as you like as long as they share a unit. The map re-renders using the combined total, and the legend names the sum.

This is different from the cross-axis unit note below. Summing is within one axis, so those measures genuinely need to match — MapBees grays out (and explains) any measure that would mix units, like adding a head-count to a cubic-meter figure. Mixing units is only ever safe between X and Y, never inside a single axis' sum.

Not sure what to put on the second axis?

Once the first measure is picked, open the second picker and its top lists Same pattern as your first measure: up to three measures that rise and fall with it across the city's hexes, each marked very closely, closely or somewhat, and under them the one that Goes the other way. Tap one and it becomes the second measure. That is a fact about where things are, never a sign that one causes the other. On the map it shows up plainly: a measure that follows the first very closely puts most hexes along the legend's diagonal, from pale corner to dark, while the one going the other way fills the two off-corners.

“But one is m³ and the other is a head-count!”

You may have noticed the two axes use completely different units — cubic meters of building versus a plain count of people. MapBees even pops up a gentle note about it. That is fine, and here is why.

A bivariate map never compares the two numbers against each other. It compares each hex against all the other hexes on the same axis. The X axis is ranked only against other X values, and the Y axis only against other Y values. So “a lot of building” and “a lot of people” are each judged on their own scale — the units never touch.

The pattern you see is always valid even with mismatched units. The only thing to do is read the raw numbers in a hex's hover card with a little care — don't mentally subtract “200 people” from “243,000 m³,” because they measure different things.

Reading the color: the 3×3 legend

The little color square in the bottom corner of the map is your decoder. It is a 3×3 grid — three steps for X (Low, Medium, High) crossed with three steps for Y (Low, Medium, High), giving nine possible colors.

Read it like a chart you learned in school: move right for more on the X measure (more built volume), and move up for more on the Y measure (more people). The corner where both are highest gets the deepest, darkest color — that is the simple rule: darker means both are high at once.

Total (people) — more →
Low / High
Med / High
both high
Low / Med
Med / Med
High / Med
Low / Low
Med / Low
High / Low
Residential + Outbuilding (m³) — more →
The 3×3 legend. Move right = more built volume; move up = more people. The darkest bottom corner is where both are high at once.

So a pale hex is “low on both.” A strongly teal hex is “lots of building, but not many people.” A strongly magenta hex is “lots of people, but not much built structure.” And the dark corner is “packed with both.” Once you internalize the corners, you can read the whole city without thinking.

“High” is a word — the legend shows you the number

A grid labeled only Low / Medium / High reads like a statement about level: high means a lot. But the bands are drawn by cutting a list of values into three, and depending on how that cut is made, “High” can start at a number that is not high at all.

So the legend under the map prints the actual ladder for each axis — the smallest value, the two cut points, the largest — in that axis's own unit:

Residential + Outbuilding

0 m³ · 270,065 m³ · 1,031,079 m³ · 2,071,051 m³

Read: everything up to 270,065 m³ is “Low,” the middle band runs to 1,031,079 m³, and “High” is everything above that, up to 2.1 million m³. Hover a square of the legend and it says the same thing in words, plus how much of the city is in it.

That last part is the point. “High” is not a third of New York — building volume is a long tail, and the cut was placed where the data breaks, not where the list divides in three. The legend says what that does underneath, in plain words: on this map it notes that 53 in every 100 hexes have none of the two building types, so two of the three colors start at the same number and cannot tell each other apart. You could not have guessed that from the color, and you do not have to.

This is the difference between a map you can check and a map you have to trust. If a band's edge looks wrong to you — “High” starting below what you know the city's own figure to be, say — you can see it, and change the cut.

Hover any hex to see the exact numbers

Colors give you the big picture; the hover card gives you the receipts. Hover (or tap) a hex and MapBees tells you which of the nine combinations it belongs to, plus the real value behind each axis.

Hovering a hex in Manhattan: “Low Residential + Outbuilding · High Total” — 215,616 m³ of building, 3,732 people. The band and the raw number are always shown together.

Notice the read-out names the band (“Low,” “High”) and the raw value beside it. The highlighted square in the legend shows exactly which of the nine squares you are on. You can also hover a square in the legend to light up every matching hex on the map — a fast way to ask “show me everywhere that's high-building, low-people.”

From a city of color to a shortlist: Standouts

Lighting up one square of the legend shows you every matching hex; it does not tell you where they gather. For that, press Standouts by the map-type picker. On a Cross two map the panel reads The most hexes in each picked combination, and under Pick combinations - first measure across, second up it shows the same 3×3 grid as the legend: tap the squares you care about - “high building, low people”, say - and press Find Standouts.

Each Standout is a ranked group of nearby hexes in that combination, outlined on the map and named after its neighborhood. They are ranked by how many of the picked combination's hexes they hold, so #1 is the place where that combination is most concentrated, not just where one hex happens to have it. The count menu sets how many you get for each picked square, and Max size sets how far across one may reach.

Picking a color scheme

The relationship is the same no matter which palette you choose — the colors are purely about readability and taste. MapBees ships four hand-tuned schemes (Teal · Magenta, Blue · Pink, Green · Purple, Orange · Blue). Each one keeps the same logic: one color family leans toward the X measure, another toward the Y, and they blend toward a dark corner where both are high.

Pick whichever you can read most comfortably — on a dark map, on a bright day, or for color-vision needs. Switching palettes is instant and changes nothing about the data underneath.

Where do the Low / Medium / High lines go?

Here is the one genuinely important choice on the panel: Classification. To turn thousands of different values into just three bands, MapBees has to draw two cut lines — one between Low and Medium, one between Medium and High. Where it draws those lines changes which hexes look high or low.

That is not a trick or a bias — it is a real decision every map-maker faces, and there is no single “correct” answer for every measure. So MapBees picks one for you by default and tells you which it picked, and you can override it live. None of the options re-fetches data; they just re-draw the cut lines.

Chosen for these valuesthe “Auto” button

Cut whichever way says the most true about each measure - and say which was chosen, and why.

How it works. MapBees looks at how the numbers are actually spread on each axis — how many hexes have none at all, how far the top stretches, whether the city has a figure of its own to compare against — and picks the cut that says the most true thing. Each axis is decided separately.

How it feels. The map you would have arrived at after trying the others, without trying the others. And it tells you which one it picked, in a line under the legend.

Best for. Almost always. Start here; switch only when you want to test the pattern by hand.

Equal share of hexesthe “Equal shares” button

Every color covers about a third of the map, however big or small the values are.

How it works. MapBees sorts every hex from lowest to highest and splits the list into three equal-sized piles. The bottom third is “Low,” the middle third “Medium,” the top third “High.”

How it feels. Always a full spread of color — which is exactly the catch. The bands are a rank, not a level: on a measure where most of the city has very little, the “High” third can begin at a number that is not high at all.

Best for. Seeing which hexes lead and trail, when you read the band edges printed under the legend rather than the word “High.”

Even value stepsthe “Value steps” button

Every color covers the same slice of the range. Where most hexes are near zero, almost all of them land in one color.

How it works. MapBees takes the smallest and largest value and chops the gap between them into three equal-width slices — 0–100, 100–200, 200–300 — regardless of how many hexes land in each.

How it feels. Honest about real magnitude, and often nearly empty because of it: one tower of a value can push almost every hex into the bottom slice, leaving a map with one color on it.

Best for. Evenly spread data, or when the true size of the gap between hexes is the point.

Natural breaksthe “Natural” button

Colors are cut where the data itself has gaps.

How it works. Uses the Jenks natural-breaks method: it hunts for the points where the data has real gaps and draws the cut lines there, so each band holds values that are genuinely similar to each other.

How it feels. Usually the most “true to the data” look — clusters that belong together stay together, and the breaks land where the city already put them.

Best for. Data that forms clear clumps, when you want the map to reflect real groupings.

Against the city's own figureno button — chosen for you

Colors are cut at the city's own amount, so 1× means 'as much as the city' - the one cut whose colors mean the same thing on two measures the city has very different amounts of.

How it works. The cut ignores the spread entirely and falls at the city's own figure: the middle band is “about as much as the city has,” the outer two are clearly more and clearly less.

How it feels. The only cut whose colors mean the same thing on two axes the city has very different amounts of — because 1× means “as much as the city” on both.

Best for. Axes you have switched to “Fair share.” MapBees reaches for it on its own; it is not in the button row, because on an axis read as a raw number there is no city figure to cut at.

The map cuts each axis on its own — and says why

Classification starts on Auto, and Auto is decided separately for X and for Y. That matters more than it sounds: the two sides of a bivariate map have nothing in common but the map. Building volume in New York is a long tail with a lot of near-zero hexes; population is far more evenly spread. One cut that suits both is a coincidence, not a rule.

So MapBees measures how each axis is actually spread, applies a small set of rules, and picks per axis. On our New York map both axes happen to land on the same answer — Natural breaks, because both are long tails with their gaps in different places — so the legend says so once. When they disagree, it says that instead. Underneath the legend you get one of two lines:

Both axes agreed. “Chosen: Natural breaks. Colors are cut where the data itself has gaps.” — the cut is named, and flagged as a choice rather than a default.
They didn't. “Each axis cut its own way. These two spread out too differently for one cut to suit both.” — and each axis's ladder is then labeled with the cut it got.

The warnings, in the measure's own numbers

When something about the cut is worth knowing, the legend says it plainly, using the numbers on your screen rather than statistical vocabulary. Three you are likely to meet — the first two are on the New York map above:

  • “Cut into equal shares, the top third of hexes would run from 93,882 to 861,132 - a 9-fold spread squeezed into the top of the scale.” — why the map was not cut into equal shares: the top third is so spread out that one band could not tell its hexes apart.
  • “Even value steps put 99 of every 100 hexes in a single color here, leaving the rest of the map almost unused.” — a warning attached to the Value steps option before you press it, not after you wonder why the map went blank.
  • “52 in every 100 hexes have none of this, so the lowest colors start at the same number and cannot tell each other apart.” — half the city is zero, and the bottom bands are a formality. (That one is from a London café map, where it is true.)

Your choice always wins. Press one of the three buttons and that cut is pinned for both axes — the panel says so (“Pinned, so both measures are cut this way even where that hides what one of them is doing”) and offers one click back to Auto. A pinned cut also travels in the link, so whoever opens it sees the map you saw.

Each axis is counted its own way

Under each measure's picker sit two more rows, and each axis keeps its own setting, so the first measure can be counted one way and the second another.

  • Count as. Total, Per 1 000 residents, Per km² or Share of its category — plus, where the city's census publishes them, per 1 000 households, children under 10 or residents 65 and over, or per 100 000 m³ of residential building volume. “Cafés per 1 000 residents” across against “residents 65 and over” up is a different question from raw café counts against them.
  • Look at. Just this hex, or Within a 10-minute walk — the hex read together with the hexes within a 10-minute walk around it. Useful when a café two streets away matters as much as one in the hex itself.

A row only offers what makes sense for the measure in it. A choice that does not fit stays listed but grayed out, and Why are some options unavailable? under the row says why.

When ranking isn't enough: read an axis against the city

There is one situation no color rule can fix, and it is worth knowing because it is easy to walk into. Cross two shares whose citywide levels are far apart — a group that is 5% of the city against one that is 47% — and a ranked map will happily paint a big region “high” on the 5% axis. It is telling the truth about rank and being read as a claim about level.

The fix is not a palette, it is the measure. Each axis has a Show row with two settings:

  • Amount. Cubic meters, head-counts, counts of cafés — the value itself, not compared with anything, read against the other hexes.
  • Fair share. Each hex becomes a multiple of the city's own figure — 1× is exactly average, 2× twice that, 0.5× half. On a bivariate axis the comparison is always against the whole city, so set it on both axes and the two sides finally mean the same thing.

Switch an axis to “Fair share” and Auto usually reaches for the one cut that is only available there: bands drawn at the city's own figure, so the middle color is “about average” and the outer two are clearly more and clearly less. That cut is not in the button row, because on an axis showing a raw number there is no average to cut at — it would be two numbers about nothing.

On our New York example this is a useful second reading rather than a correction: built volume and population are different units, not two versions of the same share. Try it when both axes are shares or rates of the same kind — that is where a rank map is most likely to be misread.

A closer look at “Natural” (Jenks natural breaks)

“Natural” is worth a sentence more because it is the one Auto reaches for most often on this kind of data. It uses an algorithm called Jenks natural breaks, named after the cartographer George Jenks. The idea is intuitive: real-world data usually clumps, and you want the bands to fall in the empty gaps between clumps rather than slicing straight through a tight group.

Imagine plotting every hex's value on a number line. You would see little crowds of dots with gaps between them. Jenks mathematically finds the cut points that keep each crowd as tightly together as possible while making the crowds as different from each other as possible. The result is bands that match how the data actually groups in the real world — which is why it so often “looks right.”

Equal shares guarantees an even spread of color, Value steps respects raw magnitude, and Natural respects the data's own shape. Flip between them and watch the map — if the big picture barely changes, your pattern is robust. If it changes a lot, it means a few hexes sit right on a boundary, which is itself useful to know.

Which one should you pick?

A simple rule of thumb, no statistics required:

  • Not sure? Leave it on Auto. It reads both axes, picks per axis, and names what it picked — you are never guessing which cut you are looking at.
  • Want to see which hexes lead and trail, whatever the levels? Equal shares fills the map with contrast — read the band edges in the legend, not the word “High.”
  • Care about the true size of the gap between hexes (one hex has twice the building of another)? Value steps — and heed the warning if it says almost everything lands in one color.
  • Want the map to honor the natural groups in the city? Natural (Jenks).
  • Comparing two shares with very different citywide levels? Change the measure, not the colors: set both axes' Show row to “Fair share.”

The honest best practice is to try all three by hand at least once. They are one click apart, nothing re-loads, and the way the map shifts (or doesn't) tells you how solid your story is.

The whole idea, in six lines

  • A Cross two map (a bivariate map) colors every hex by two measures at once — X goes left-to-right, Y goes bottom-to-top.
  • Each axis can be more than one measure: our X is Residential + Outbuilding volume, two same-unit measures summed in the picker.
  • Mismatched units are fine between X and Y — each axis is ranked on its own, so m³ and head-counts never get compared directly. Within one axis's sum, units must match.
  • Darker corner = both high. Hover a hex or a legend square for exact numbers, the band's share of the city, and to isolate a combination.
  • Classification decides where the Low/Medium/High lines fall. Auto picks per axis and names its choice; the legend prints the real band edges so you can check it; pinning one cut is one click, and travels in the link.
  • When ranking would mislead — two shares with very different citywide levels — set each axis to “Fair share,” where 1× means as much as the city has.

Quick questions

What is a bivariate map?

A bivariate map - in MapBees, the Cross two map - colors every hex by two measures at the same time - one running left-to-right (X) and one running bottom-to-top (Y) - so you can see how the two relate across a whole city in one glance.

Does it matter that the two measures use different units?

No. Each axis is ranked only against other values on the same axis, so cubic meters of building and a count of people are never compared directly. The pattern stays valid; just read the raw numbers in a hex's hover card with care.

How do I read the bivariate legend?

It is a 3x3 grid: move right for more of the X measure and up for more of the Y measure. Paler hexes are low on both, and the darkest corner means both measures are high at once.

Can one axis show more than one measure?

Yes. The axis picker is a tree of checkboxes, so you can tick several measures that share a unit and MapBees adds their per-hex values together before ranking that axis - the example in this guide uses residential plus outbuilding volume as a single X axis. Measures with different units cannot be summed, and MapBees grays them out and says why. The second picker also opens with the measures that follow the same pattern as the first one, so you can pick a pair in one tap.

What is the difference between Equal shares, Value steps, and Natural classification?

Equal shares (quantile) puts about a third of the map in each color, Value steps (equal interval) gives each color the same slice of the value range, and Natural (Jenks) places the band edges in the natural gaps of the data so similar values stay grouped together. MapBees starts on Auto, which picks one per axis and names its choice.

Does 'High' on a bivariate map mean the value is actually high?

Not necessarily - with an equal-shares cut, 'High' only means the top third of hexes, which can start at a low number. That is why MapBees prints each axis's real band edges under the legend, alongside how much of the city each band covers, and warns when a band's edge falls below the city's own figure.

What are Jenks natural breaks?

Jenks natural breaks is a classification method that finds the cut points keeping each band's values as similar as possible while making the bands as different from each other as possible - so the colors match how the data actually groups.

How do I compare two measures the city has very different amounts of?

Set each axis's Show row to Fair share. Every hex then becomes a multiple of the city's own figure, where 1x means 'as much as the city has', so two shares with very different citywide levels finally mean the same thing on both axes.

Can each axis be counted differently, say per resident or within a 10-minute walk?

Yes. Each axis has its own Count as row (Total, Per 1 000 residents, Per km², Share of its category, and other bases where the city's census publishes them) and its own Look at row (Just this hex or Within a 10-minute walk), so the two measures can be counted different ways.

How do I find where one combination of the two measures gathers?

Press Standouts by the map-type picker, tap the squares you care about under 'Pick combinations - first measure across, second up', and press Find Standouts. Each Standout is a ranked group of nearby hexes in that combination, outlined on the map and named after its neighborhood, ranked by how many of those hexes it holds.

See it on a real map

The best way to understand the score is to play with it. The full app is on a Free Tier, with no sales call.

About the author

Tinkal Gogoi(LinkedIn profile, opens in a new tab)Founder & Location Data Engineer

Builds MapBees's location-intelligence pipeline end to end — census and Overture Maps ingestion, H3 hex scoring, and the map interface — and writes the methodology behind every number on the site.