gog for Python
Draw a plot by describing it. You name a table, a shape to draw, and which
column goes to which part of the picture. gog turns that description into an
SVG.
One engine, written in Rust, does the drawing for R, Python, Julia and JavaScript. Each language writes the plot in its own idiom and gets back the same picture, to the byte.
Why you might want this
One vocabulary instead of a hundred chart types. There is no histogram()
to look up, and no arguments that belong to it alone. The whole vocabulary fits
on one page, and the combinations are the chart types: a histogram is bar * bin, a bar shape plus a binning statistic. Keep the statistic and change the
shape, and the same counts draw a line, an area or a step. You learn the words
once and they keep working.
It says no, and says what to write instead. Ask for something the grammar cannot mean and you get a refusal that names the fix. Nothing is accepted and then quietly dropped, so a plot that draws is a plot that means what you wrote.
The same picture from four languages. A colleague working in R, Julia or JavaScript writes the same sentence in their own idiom and gets the same file, to the byte. A team that does not share a language can still share a plot.
A plot is data, not code. What you build is a description that the engine draws, so it can be saved, compared, generated by another program, or sent over a network. That is awkward when a plot is a live object inside a session.
Things that usually need a second package are already here — three dimensions, animation, circular layouts, treemaps and contour maps are part of the same vocabulary rather than add-ons with a syntax of their own.
Install
pip install gog
The wheel carries the drawing engine, so there is nothing else to install and no Rust toolchain to set up.
Your first plot
from gog import *
gm = {"gdp": [1000, 8000, 30000],
"life": [52, 68, 79],
"continent": ["Africa", "Asia", "Europe"]}
(data(gm) + point + x(col.gdp, scale="log") + y(col.life)
+ color(col.continent)).save("life.svg")
Read that aloud: "Given gm: points, x is gdp on a log scale, y is life, color by continent." That is the whole idea. A plot is a sentence, and you can say it before you can write it.
A table is a dict of columns, or anything with .columns and df[name] — a
pandas or polars frame works, and neither is required.
What you can draw
Shapes — points, lines, bars, areas, steps, error bars, boxes, ribbons, text, paths, reference lines, shaded regions, and surfaces in three dimensions.
Ways to show a column — position, color, size, shape, texture, transparency, or a split into one series per group.
Statistics, written into the sentence — binning, counting, sums, averages, medians, ranges, smoothing curves and density estimates. You do not calculate them beforehand.
Arrangements — small multiples in rows or columns, several plots on one page, a circular layout, a third dimension, and animation over a column.
There are no chart-type functions. A histogram is bar * bin, a pie is a bar
chart in a circle, and a violin is a density drawn as a ribbon. Learn the words
once and they combine.
When a plot cannot be drawn, gog says so and names what to write instead. It
never quietly ignores part of what you asked for.
Two things Python needs
A column is col.name. Python has no bare names, and here a plain string is
a value, as in style(color="tomato"). Writing x("gdp") is refused, with the
correct spelling named. Use col["life exp"] for a name with a space in it.
from gog import * replaces six builtins — bin, sum, min, max and
range are statistics here, and map is a coordinate space. If you need the
originals in the same file, use import gog and write gog.point, or take one
back with from builtins import sum.
Examples
The manual is a book, and every plot in it is drawn by the engine while the page is being built. Nothing in it is a screenshot.
https://psychometrician.github.io/gog-book/
It is written in R, and every sentence translates by the two rules above. The book's Python chapter is the difference list, about a page long.
License
Apache License 2.0. See LICENSE and NOTICE, which ship inside the package.
Release files for gog 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| gog-0.1.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| gog-0.1.0-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| gog-0.1.0-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| gog-0.1.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| gog-0.1.0-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details |
Total release size: 16.3 MB
Release files / gog-0.1.0-py3-none-win_amd64.whl
| Download URL | gog-0.1.0-py3-none-win_amd64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
c557e4a2a9ce3f51ba73f65a1834a0b77366e4f0b250f26069ba2974eebcfccf
|
|
BLAKE2b-256 checksum How to use checksums |
18b23c0fd6a9679aff9b7158e54f25f66adea5f81a69597144187b7ae512af1c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 18, 2026.
Transparency logRelease files / gog-0.1.0-py3-none-manylinux_2_28_x86_64.whl
| Download URL | gog-0.1.0-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.5 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
be6dfa509618936e927a4b75a4bd1431598dde799ce1ff38f33ca81cbedd48f0
|
|
BLAKE2b-256 checksum How to use checksums |
9489d39b74741c1f75dc649b688c50e41fad84796fedfedb40e5a2ca52d185aa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 18, 2026.
Transparency logRelease files / gog-0.1.0-py3-none-manylinux_2_28_aarch64.whl
| Download URL | gog-0.1.0-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
2cf9446ff5695a15e1ce45debf8b7171434a660f3b45e7e4c79ce4aff423a44c
|
|
BLAKE2b-256 checksum How to use checksums |
c43c51b4563c3ecf0b2af4422bd917f4decefeed4d252b1cc1c7eaf413232b0d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 18, 2026.
Transparency logRelease files / gog-0.1.0-py3-none-macosx_11_0_arm64.whl
| Download URL | gog-0.1.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.1 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5287e985e88214bb219668df84ff6f36e8854f5d753f7e6442cf4dd474e28626
|
|
BLAKE2b-256 checksum How to use checksums |
044ed4e5dea6e05215aa9603c43dcca7696eef0c786173924155cf450e434f33
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 18, 2026.
Transparency logRelease files / gog-0.1.0-py3-none-macosx_10_12_x86_64.whl
| Download URL | gog-0.1.0-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
300aebc4ca81c31b10c6b247fb6f5d224062a2ce523553c34d0d6ee0826b92a9
|
|
BLAKE2b-256 checksum How to use checksums |
527dec103785b95dfbb3458bd43ffc8282b0cd3f1b6bb0d5f08038fbcb5200f5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 18, 2026.
Transparency log