Appendix C — Combinations
Every mark down the side, every channel across the top: the whole of what the grammar lets you combine, on one page. This page holds four crossings. The first is what a mark lets you map (the channels); the second is what a mark lets you derive (the transforms); the third is which two transforms can stand together on one mark; the fourth is where a mark can be drawn (the coordinate spaces). Not only what a mark takes, but what it does not, and the surprising-but-legal pairings you would never think to try.
These grids are the orthogonality law made visible. Law 1 says every compatible atom combines with every other; a table is that promise enumerated, one cell at a time. It is the direct analog of the jamo (자모) chart a Hangeul (한글) learner reads. The jamo are Hangeul’s individual letters: its consonants and its vowels. A syllable block is what they assemble into. This book has used that pairing from the start: a mark is a consonant and a position is a vowel, and neither draws alone. The chart puts the consonants down the side and the vowels across the top. The whole syllable space appears in the crossing.
Legal is not the same as useful. Law 8, Pronounceable ≠ Useable, guarantees only that the engine draws what a cell allows. Whether it should be drawn is your judgment. A cell the engine refuses teaches as much as one it draws. It marks a real limit of the geometry, not an oversight.
Every grid here is generated live from the engine’s own rule table, each time the book builds. That is the same table the engine consults to accept or refuse your plot. A grid that is described can stop matching the code; a grid that is generated cannot. Add a mark, a channel, a transform or a space and these pages widen by themselves.
C.1 Marks and channels
Down the side, the marks; across the top, the channels. A cell says whether you may map a column to that channel on that mark.
| Mark | x |
y |
z |
color |
size |
shape |
pattern |
opacity |
group |
label |
play |
|---|---|---|---|---|---|---|---|---|---|---|---|
point |
● | ● | ✅ | ✅ | ✅ | ✅ | — | ✅ | — | — | ✅ |
line |
● | ● | ◌ | ✅ | ○ | — | ✅ | ○ | ✅ | — | ✅ |
area |
● | ● | ◌ | ✅ | — | — | ✅ | ○ | ✅ | — | ✅ |
bar |
● | ● | ✅ | ✅ | — | — | ✅ | ✅ | — | — | ✅ |
step |
● | ● | ◌ | ✅ | ○ | — | ✅ | ○ | ✅ | — | ✅ |
interval |
● | ● | ✅ | ✅ | ○ | — | ✅ | ○ | ✅ | — | ✅ |
box |
● | ● | ✅ | ✅ | ○ | — | ✅ | ○ | ✅ | — | ✅ |
ribbon |
● | ● | ◌ | ✅ | — | — | ✅ | ○ | ✅ | — | ✅ |
text |
● | ● | ◌ | ✅ | ◌ | — | — | ◌ | — | ● | ✅ |
path |
● | ● | ✅ | ✅ | ○ | — | ✅ | ○ | ✅ | — | ✅ |
rule |
✅ | ✅ | ◌ | ✅ | ○ | — | ✅ | ○ | — | — | ✅ |
zone |
✅ | ✅ | ◌ | ✅ | — | — | ✅ | ○ | ✅ | — | ✅ |
surface |
● | ● | ● | ✅ | — | — | — | ✅ | ✅ | — | ✅ |
edge |
— | — | — | ✅ | ○ | — | ◌ | ✅ | — | — | ✅ |
Reading the five glyphs:
- ● must: a required position. The mark does not render without it. A
pointneeds anxand ay; atextneeds itslabel. - ✅ maps: bind a column here and the engine draws it today. The ordinary case, a channel doing its job.
- ○ set: the mark has this feature, but not row by row. A
lineis one stroke, so itssizeandopacityare a single value for the whole layer, fixed withstyle()rather than mapped. Those constants have their own Mark × Setting grid. - ◌ not drawn: legal grammar the engine refuses today, with a direction rather than a wrong picture. One glyph, three verdicts, and the refusal message tells you which you have. Owed: a mapped
sizeoropacityontext,zontext, andpatternonedge. Blocked on infrastructure:zonruleand onzone, whose 3-D forms are a plane and a slab with no footprint to sort by, so they need an engine that can tell what hides what. Decided:zonline,step,areaandribbon, which read a domain left to right where a cube has none, and which namepathas the direction. The Mark × Space grid below is the same three readings on its own blanks. - — none: the mark has no such feature. A
barhas no glyph toshape, apointnothing togroupinto a line. Binding it means nothing, and the engine says so.
Five things the grid shows that prose has to say one at a time:
groupsplits aline, not abar. Run down thegroupcolumn:—on the marks that draw one shape per row (point,bar,text,rule,edge), ✅ on every mark made of a connected run. A bar is split into groups bycolor, then piled or set side by side withstack/dodge; a baregrouphas no line to divide.labelbelongs totextalone. Its column is ● ontextand—everywhere else. A labeled scatter is the superpositionpoint + text, never alabelhung on thepoint.- Categories on
xand ony. A category onxreaches every mark butsurface, and onyit reaches far fewer. Read thexandycolumns against each other; which types each accepts is in Channels, and the split divides the marks with positions in two. The glyph marks (point,text) and the marks whose slot width does the measuring (bar,interval,box) take either type on both positions, which is why a strip plot, a horizontal bar and a categorical box all follow from one rule. So dopath, which sorts nothing and therefore has no domain,rule, which measures nothing on either axis, andzone. Azonemeasures nothing by length, which is what makes a heatmap cell a zone rather than a second kind of bar. The path and region marks (line,step,area,ribbon) take either type onxalone: theirxis the domain the path is read along and theiryis the quantity it traces, and those are not the same kind of axis. A glyph’s two axes are.surfacestands outside the split: both of its positions measure, because a sheet is a height read at a place. - Three rows have no ● at all.
ruleandzoneshow ✅ on both positions and ● on neither, because each needs one of the two and no per-channel cell can say “either, but not both”.edgeis the third, and it takes no position at all. Those obligations are stated once in the engine instead. Two ✅s and no ● means the mark needs one position, and the panel supplies the other (Rule, Zone). zoneandsurfacetake either type oncolor. They are the two fills that do: every other region’s fill takes a category, and these two take a number as well, reading the ramp.
C.2 Marks and transforms
The second crossing: not what a mark maps, but what it derives. A transform enters through * (bar * bin, interval * range, point * jitter), and which transform a mark takes is decided by the mark’s geometry against the transform’s kind. There are three kinds, and each has its own grid below.
Three glyphs read every cell:
- ✅ combines: the transform applies to this mark and renders.
- ● required: the transform’s kind is the mark’s minimum syllable. An
intervaland aribbonfloat between a low and a high, so they will not draw until one transform of that kind supplies the pair. The●cells in a row are a choice, not a list: pick one. Azoneshows ● wherever a transform is one of the ways it gets its sides. - — none: the mark has no use for this kind of transform, and the engine refuses it with a direction toward the transform its geometry does want.
C.2.1 Statistics: a value per group
Most summarizing transforms reduce the data to one value at each x: a bin’s count, a group’s mean, a smoothed height. Any mark that draws a value at each x can draw that summary, so the whole block moves together. That is why a distribution has three spellings rather than one histogram with a shape option: bar * bin fills it, line * bin is the frequency polygon, step * bin the staircase.
| Mark | bin |
smooth |
count |
density |
proportion |
sum |
mean |
median |
max |
min |
quantile |
partition |
flow |
layout |
cluster |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
point |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | — | ✅ | — |
line |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | — | — | — |
area |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | — | — | — |
bar |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | — | — | — |
step |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | — | — | — |
interval |
— | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
box |
— | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
ribbon |
— | — | — | ● | — | — | — | — | — | — | — | — | ● | — | — |
text |
— | — | — | — | — | — | — | — | — | — | — | ✅ | ✅ | ✅ | — |
path |
— | — | — | ✅ | — | — | — | — | — | — | — | — | — | — | ✅ |
rule |
— | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
zone |
● | — | ● | ● | ● | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ● | ● | — | ✅ |
surface |
✅ | — | — | ✅ | — | ✅ | ✅ | ✅ | ✅ | ✅ | — | — | — | — | — |
edge |
— | — | — | — | — | — | — | — | — | — | — | — | — | ● | — |
Five marks (point, line, area, bar, step) take the whole family of summaries. interval, box and rule take none, and each for a reason the next two grids give. A span mark needs a pair, not a single value. A box carries its own summary: the five numbers are injected by the mark rather than composed, so no statistic column applies to it. A rule handed a whole axis to the panel, so there is no measure to compute.
Four more transforms build a shape rather than a summary, and they fill most of the rows in between. partition reads a hierarchy (zone, text), flow reads a path through stages (ribbon, zone, text), layout places a network (edge, point, text), and cluster orders leaves by similarity (path, zone). Each has a chapter of its own.
C.2.2 Ranges and bands
Four transforms produce a pair of values, a low boundary and a high one, per group. range, confidence and deviation compute the pair from your data; bounds reshapes a pair you computed already. Five marks draw such a pair: interval shows it as a whisker, ribbon fills it, line and step trace its two boundaries, and zone reads it as two sides.
| Mark | range |
confidence |
deviation |
bounds |
|---|---|---|---|---|
point |
— | — | — | — |
line |
✅ | ✅ | ✅ | ✅ |
area |
— | — | — | — |
bar |
— | — | — | — |
step |
✅ | ✅ | ✅ | ✅ |
interval |
● | ● | ● | ● |
box |
— | — | — | — |
ribbon |
● | ● | ● | ● |
text |
— | — | — | — |
path |
— | — | — | — |
rule |
— | — | — | — |
zone |
— | — | — | ● |
surface |
— | — | — | — |
edge |
— | — | — | — |
The ● cells on interval, ribbon and zone are a requirement, not a permission. An interval and a ribbon have no baseline to start from, so neither renders until a pair transform gives it a low and a high: interval * range is the whole minimum syllable, a bare interval is refused. A line or a step already draws fine on its own, so the same transform is optional there, a second way to use the mark. Everywhere else the pair has nowhere to go: on a point or a bar it is refused toward the whisker, on an area toward the ribbon that is its filled twin.
C.2.3 Collision modifiers: an offset, not a statistic
When marks collide at one position, four offsets pull them apart, and which one a mark takes is decided by its geometry and by the axis the collision is on. dodge subdivides a width, so it serves the marks that have one (bar, box, interval). stack accumulates along the measure axis, so it serves the marks that can spend a span: bar and area fill it with length, and a point has no length to stretch, so it uses the span to count dots, which is the dot plot. jitter spreads a mark with no width along a categorical axis, which is point alone. repel divides on a different question: not what geometry a mark has, but what it is made of. A label is as wide as the word it draws, so two labels overlap where their points do not, and text is the only mark made of words.
| Mark | dodge |
stack |
jitter |
repel |
|---|---|---|---|---|
point |
— | ✅ | ✅ | — |
line |
— | — | — | — |
area |
— | ✅ | — | — |
bar |
✅ | ✅ | — | — |
step |
— | — | — | — |
interval |
✅ | — | — | — |
box |
✅ | — | — | — |
ribbon |
— | — | — | — |
text |
— | — | — | ✅ |
path |
— | — | — | — |
rule |
— | — | — | — |
zone |
— | — | — | — |
surface |
— | — | — | — |
edge |
— | — | — | — |
Six marks take an offset, and two of them take two. bar has both a width and a measure axis, so it takes dodge and stack; point has neither, so it takes stack and jitter. stack answers its overlap along the measure axis (a pile of dots, which can be counted); jitter answers the same mark’s overlap along a categorical one (a nudge, because a category has no magnitude to spend). Everywhere else the division is exclusive, which is why the engine can always name the right transform when you ask for the wrong one. Ask for point * dodge and it names jitter; ask for area * dodge and it names stack. A box shows the split cleanly: it takes no statistic (its own is built in) yet still takes dodge, because setting grouped boxes side by side is a question about position, orthogonal to the summary each box already carries.
C.3 Transforms and transforms
The third crossing is the only one where a mark does not appear. Two transforms can follow one mark: bar * bin * mean cuts the axis into bands, then averages inside each. Which pairs can do that is decided by the transforms alone, and by one rule.
A transform has a job. There are four of them, and every transform in gog fills at least one, except repel:
| job | the question it answers | the transforms that answer it |
|---|---|---|
| extent | where are the cells? | bin, density, smooth, partition, and bounds on a zone |
| measure | what is in them? | count, sum, mean, median, max, min, quantile, range, confidence, deviation, bounds |
| scale | what scale is the answer read on? | proportion, and stack(share = TRUE) |
| position | where do the marks sit? | dodge, stack, jitter |
repel fills no job at all. It moves a label after every job has run, so it contradicts nothing and chains with all three offsets. That is the whole repel row in the grid below. flow, layout and cluster fill all four jobs at once. Each computes the whole picture, so only repel chains with one.
Two transforms compose when they do different jobs, and contradict when they do the same one. A cell holds one extent, one measure, one scale and one position. So a second transform doing a job the first already did leaves the engine no reading that keeps both, and it refuses rather than drawing one and discarding the other.
One transform is the exception, and it is the exception that makes chaining useful. bin does two jobs: it cuts the axis, and it counts what lands in each band. The count is a by-product of the cut, so bin can give it up, and it gives it up to a transform you handed a column. That is why bar * bin * mean composes: bin supplies the cells and mean supplies their value. And it is why bar * bin * count does not, since count was never handed a column to reduce.
bin |
smooth |
count |
density |
proportion |
sum |
mean |
median |
max |
min |
quantile |
range |
confidence |
deviation |
bounds |
partition |
flow |
layout |
cluster |
dodge |
stack |
jitter |
repel |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
bin |
· | — | — | — | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
smooth |
— | · | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
count |
— | — | · | — | ✅ | — | — | — | — | — | — | — | — | — | — | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
density |
— | — | — | · | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
proportion |
✅ | — | ✅ | — | · | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | — | ✅ | — | ✅ | — | — | — | ✅ | ✅ | ✅ | ✅ |
sum |
✅ | — | — | — | ✅ | · | — | — | — | — | — | — | — | — | — | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
mean |
✅ | — | — | — | ✅ | — | · | — | — | — | — | — | — | — | — | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
median |
✅ | — | — | — | ✅ | — | — | · | — | — | — | — | — | — | — | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
max |
✅ | — | — | — | ✅ | — | — | — | · | — | — | — | — | — | — | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
min |
✅ | — | — | — | ✅ | — | — | — | — | · | — | — | — | — | — | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
quantile |
✅ | — | — | — | ✅ | — | — | — | — | — | · | — | — | — | — | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
range |
✅ | — | — | — | — | — | — | — | — | — | — | · | — | — | — | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
confidence |
✅ | — | — | — | — | — | — | — | — | — | — | — | · | — | — | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
deviation |
✅ | — | — | — | ✅ | — | — | — | — | — | — | — | — | · | — | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
bounds |
✅ | — | — | — | — | — | — | — | — | — | — | — | — | — | · | — | — | — | — | ✅ | ✅ | ✅ | ✅ |
partition |
— | — | — | — | ✅ | — | — | — | — | — | — | — | — | — | — | · | — | — | — | ✅ | ✅ | ✅ | ✅ |
flow |
— | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | · | — | — | — | — | — | ✅ |
layout |
— | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | · | — | — | — | — | ✅ |
cluster |
— | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | · | — | — | — | ✅ |
dodge |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | — | — | · | — | — | ✅ |
stack |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | — | — | — | · | — | ✅ |
jitter |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | — | — | — | — | · | ✅ |
repel |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | · |
The grid is symmetric, and that is the rule showing rather than being claimed. Whether two transforms contradict is a fact about their jobs. It has nothing to do with which one you typed first. So order is yours to choose: write them in the order they happen, and the sentence reads the way it runs.
Read the block of — in the middle. Eleven transforms measure, so no two of them combine, and that block is the whole reason bar * count * mean is refused, and bar * mean * sum, and interval * range * confidence. bin is the only extent transform with a ✅ where smooth and density have —. That is the exception above, in one cell.
Two collisions the grid cannot show, because both depend on something outside the pair. stack(share = TRUE) divides each pile by its own total, which is a scale. proportion divides again, and the second division has no whole left to be a share of. And bounds says where a zone’s sides are. On that one mark it does the extent job, so it contradicts bin. On every other mark it names the low and the high on the measure axis. The engine reads both cases correctly, and the grid above shows the reading that applies everywhere else.
Chaining stops at four, and nobody chose the number. Four jobs, one transform each, so a fifth has to repeat a job on the same mark, and repeating one is the contradiction this whole section is about.
C.3.1 The shapes a long chain can take
Three and four transforms sound like a large space, and they are not. Once each job is filled at most once, and the marks are asked which transforms they take, every chain of three or four takes one of the shapes below, and there are not many. Two slots stand for a family rather than a transform: <aggregation> is any of sum, mean, median, max, min, quantile, and <collision modifier> is dodge, stack or jitter, whichever the mark takes.
| how many | the shape | the jobs it fills |
|---|---|---|
| 3 | <aggregation> * proportion * <collision modifier> |
measure, scale, position |
| 3 | bin * <aggregation> * <collision modifier> |
extent, measure, position |
| 3 | bin * <aggregation> * proportion |
extent, measure, scale |
| 3 | bin * deviation * proportion |
extent, measure, scale |
| 3 | bin * proportion * <collision modifier> |
extent, scale, position |
| 3 | count * proportion * <collision modifier> |
measure, scale, position |
| 4 | bin * <aggregation> * proportion * <collision modifier> |
extent, measure, scale, position |
Read the four-transform row first, because it is the longest chain there is. It fills each job exactly once, and only one of its slots has any real choice in it. bin is the only extent transform that hands its measurement over. proportion is the only one that rescales. The family in the last slot is picked by the mark. So the aggregation is the only free decision, which is why four is reachable and rare.
The shapes say what the transforms allow. A mark can still refuse one of them for a reason about its own geometry, and the grids earlier in this chapter are where that is decided. point * proportion * stack is the clearest case. A dot plot piles one whole dot per observation, and a share is less than one dot. So the chain is refused on point and drawn on bar.
C.4 Marks and spaces
The fourth crossing is not a channel of the mark at all. It is the coordinate space the whole plot sits in, and it asks a different question of every mark: once the plane is bent, or stood up into a cube, can this geometry still be drawn? A polar() bar is a wedge, a polar() line is a closed curve, and a z scatter is a projected cloud, all from the same sentences that draw them flat.
Two glyphs here, not five. Either the engine draws this mark in this space today, or it does not and says so:
- ✅ drawn: the mark renders in this space.
- — not drawn: legal to write and refused with direction, never half-drawn. As on the channel grid, one glyph covers owed, blocked and decided alike; which one a blank is, is the subject of the paragraphs under the table.
| Mark | flat |
space |
polar |
nest |
globe |
map |
network |
|---|---|---|---|---|---|---|---|
point |
✅ | ✅ | ✅ | — | ✅ | ✅ | ✅ |
line |
✅ | — | ✅ | — | — | — | — |
area |
✅ | — | ✅ | — | — | — | — |
bar |
✅ | ✅ | ✅ | ✅ | ✅ | — | — |
step |
✅ | — | ✅ | — | — | — | — |
interval |
✅ | ✅ | ✅ | — | — | — | — |
box |
✅ | ✅ | ✅ | — | — | — | — |
ribbon |
✅ | — | ✅ | — | — | — | — |
text |
✅ | — | ✅ | ✅ | ✅ | ✅ | ✅ |
path |
✅ | ✅ | ✅ | — | ✅ | ✅ | — |
rule |
✅ | — | ✅ | — | ✅ | ✅ | — |
zone |
✅ | — | ✅ | — | ✅ | ✅ | — |
surface |
— | ✅ | — | — | — | — | — |
edge |
— | — | — | — | — | — | ✅ |
flat is full but for surface and edge, and surface is the one to read first: it does not draw in the plane at all. Every other mark draws there, and some also stand up in the cube, while a surface is a sheet through three positions and there is no such thing without the third, so its minimum syllable includes the cube. It is the only mark that draws in the cube and not in the plane (Surface). An edge is the other kind of blank: it takes no position at all, and the space that places its nodes is the last column of this grid.
space holds six marks, and which six is a reading rather than a list. A point is a place, a path is an order, a surface is a sheet. bar, interval and box are the three marks that stand in a slot and measure along the other axis: a length, a span and a summary, which the grammar treats as one family. Each means in a cube exactly what it meant on the page.
The blanks in that column are not one kind of thing, and the refusal message says which each is. line, step, area and ribbon read a domain left to right, and a cube has no left to right, so they are decided, a ruling rather than work still owed, with path as the direction. rule and zone are blocked: their 3-D forms are a plane and a slab, neither of which has a footprint to sort by, so placing them among the data needs an engine that can tell what hides what (Space). text is owed: a label in the cube is not built yet, and the message says so rather than drawing one flat (Space).
polar matches flat: the same twelve marks draw, and the same two do not. Every mark that draws on the page draws in the circle, because every mark whose edges could be curved draws there, a band’s boundaries being the same chords a line draws. The two blanks are surface and edge, and neither is a polar refusal: a sheet needs the cube, and an edge needs the space that places its nodes (Polar).
nest is a column of the opposite shape: two cells filled and the rest blank. Those blanks are not work waiting to be done. This space asks a different question from the other five. Everywhere else a mark bends because its geometry survives a transformation of the plane; a nesting is not a transformation of the plane at all, so what it can draw is whatever it can hand a rectangle to. bar can take one, because a bar is a measure and this space is the third thing a measure can become, after a length and an angle. text can too, and it is the only mark here that names a region rather than filling one: the rectangle is already computed, so a label goes to its center, which is what a published treemap has and what a legend cannot do once the split runs past a hundred regions (Nest).
The blanks share one reason, and it is not that the space is unfinished. They are the marks placed by a position. point needs somewhere to sit. line, step, path, area and ribbon need an order along an axis, and two touching regions here are not near each other in the data. rule and zone span an axis that is not there, and box, interval and surface measure along one. edge is placed by a layout that this space does not compute. text is not among them because it is not placed by a position here either; it is placed by the region, which is the same thing that places the bar.
map, the sixth column, fills five cells, and the shape of its column comes from one fact: longitude and latitude spend both positions on the place. The marks that draw are the ones that place something. A point is a place, a path is a route, a text is a name at a place, a rule at one position spans the other and becomes a meridian or a parallel, and a zone takes its sides from a boundary, which is the choropleth (Map). The blanks share one reason: they measure along an axis, and a map has no axis to spare. The quantity moves to size or color instead, which is what cartography does with a measure once both positions are gone.
globe, the column before it, fills six cells: map’s five, and one the flattening cannot have. The sphere and its flattening answer one question: where does a place go. So the marks that place something stand on both, and only the reader’s view changes. The far half of the earth is hidden behind the sphere, a route bends along a great circle, and a rule becomes the whole meridian or parallel it holds. The sixth cell is bar, because the sphere alone has a direction to spare: the radius, which runs straight out from the surface at every place, where a bar stands as a spike with z naming its measure (Globe). The blanks read a domain along an axis, and a sphere has none to read.
network holds three cells, and one of its marks draws in no other space. edge draws nowhere else, because an edge is placed by neither position: the space computes where every node sits and the edge follows the two it joins (Network). point and text join it there, as the nodes and their names.
Three of the four crossings have a mark on every row, and reading one mark across them is worth doing. A path takes nearly every channel on Mark × Channel and almost nothing on Mark × Transform, because a path is its rows in order and every statistic replaces them. rule reads the same way on the transform grid, for a related reason. It hands a whole axis to the panel, so there is no measure to compute. And surface has a row of the transforms that cover a plane: density, which estimates a value at every node, and bin, which cuts adjacent cells, with sum, mean, median, max and min naming the column each cell holds. path derives two things. With density it draws as a contour the field a surface lifts into a sheet, and with cluster it draws the tree.
With these grids the orthogonality law is stated in full: what each mark maps, what it sets (the Mark × Setting grid), what it derives, and where it can be drawn.