Afterword

The 1446 book closed with a postface making two claims for its little alphabet: that a wise man could learn it before the morning was over, and a slow one within ten days, and that it could write down any sound at all: wind, crane, cock, dog. This book closes by restating both, because they are its own measures of success.

The ten-day challenge

You have finished the morning; here is the rest of the promise. For the next ten days, bring one question a day from your own data, not the cast’s, and answer it in one sentence. Start where the cookbook starts: what shape is the data, and what do you want to know? By day three the recipes will feel like spellings of things you already say. By day ten you should be writing sentences this book never showed you, which is the only outcome that would prove the grammar, rather than the examples, is what you learned.

If a sentence surprises you (renders when you expected a refusal, or refuses with a direction you disagree with), that is worth reporting. A grammar this small stays correct only when readers argue with it.

Growth without new words

The kernel you learned is the whole vocabulary, and nothing in it is waiting to be drawn. Every word draws. Every mark, every space, every channel, and the one selection.

Growth arrives as new pictures rather than new words. The choropleth is the pattern: no atom was added for it. It shades each country by a value, and what it needed was geometry. zone finds its sides five ways, and a boundary is one of them, drawn by the data itself. It cost no new word, because group already says which rows belong together. Map draws it with the words the kernel already had.

The same sentence you write becomes a small, engine-neutral specification inside the package. Every binding speaks it, with the same words and its own way of naming a column. Each has a short chapter of its own, a difference list: R, Python, Julia, JavaScript.

# Python
(data(gapminder_2007) + point + x(col.gdp) + y(col.life)
  + color(col.continent))
# Julia
data(gapminder_2007) + point + x(:gdp) + y(:life) + color(:continent)
// JavaScript, the one binding that cannot overload the operators
plot(data(gapminder_2007), point, x(col.gdp), y(col.life), color(col.continent))

One goal left

One goal is bigger than the rest, and half of it is already here. The engine runs inside the page: that is how a 3-D plot turns under your mouse in the web edition. What is left is the other half, written down here so you can check later whether the project did it: every example in this book editable in place. Change color(continent) to shape(continent) and watch the plot redraw. The book you are reading is already ready for that change, because every example in it is a live specification.

Writing quickly is not writing well

I think Hangeul (한글) is a perfect writing system. I should admit that I may be biased, because it is the alphabet I write with. What cannot be argued is that it is fast to read and fast to write.

Writing quickly is not the same as writing well. There is no shortcut to good writing: you read good writing, and you practice. Visualization is no different. This tool is new and it has problems, and what I hope it can be for now is something worth practicing on.

King Sejong made the alphabet. He did not write the books that were written with it. I am not a great author of plots either. What I do have is twenty years in this field as a user, watching and listening and reading. That is what I built from: a tool that is easy to learn and easy to use.

I hope good work comes out of it.

The gap

A specification is a sentence said before the picture exists. Everyone who uses this grammar lives in the moment between declaring what they want to see and finding out whether the engine agrees. The package is gog. The state of working with it is agog. We hope the book kept you there.

Be agog. Use gog.