Skip to main content

A Grammar of Graphics — one engine, spoken from Python

Project description

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 five builtinsbin, sum, min, max and range are statistics here. 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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

gog-0.0.2-py3-none-win_amd64.whl (1.3 MB view details)

Uploaded Python 3Windows x86-64

gog-0.0.2-py3-none-manylinux_2_28_x86_64.whl (1.4 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

gog-0.0.2-py3-none-manylinux_2_28_aarch64.whl (1.3 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

gog-0.0.2-py3-none-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

gog-0.0.2-py3-none-macosx_10_12_x86_64.whl (1.4 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file gog-0.0.2-py3-none-win_amd64.whl.

File metadata

  • Download URL: gog-0.0.2-py3-none-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for gog-0.0.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 780d7d1d194871a4f3a01258f1161b08f309fa9432d3ae9e4a7763a202f3c9b4
MD5 a88be0f5a48489c1e93161b71f712fbc
BLAKE2b-256 8d852a89d7ade6de5a5e48b3e43e9d234d96bc1881bcbb85817933da579430b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for gog-0.0.2-py3-none-win_amd64.whl:

Publisher: python-release.yml on psychometrician/gog

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file gog-0.0.2-py3-none-manylinux_2_28_x86_64.whl.

File metadata

  • Download URL: gog-0.0.2-py3-none-manylinux_2_28_x86_64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: Python 3, manylinux: glibc 2.28+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for gog-0.0.2-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 09f263a891d5bdc44aca0c4b0c5bbee790721cb65ccf8e3b12afad43fe6ff44a
MD5 f75ccb3f225dad03adb9fce0deb460ba
BLAKE2b-256 865d7469ded210ed91ce9ce3c3bf4b481c5e83c8fa5339a3eaf530019e1bf269

See more details on using hashes here.

Provenance

The following attestation bundles were made for gog-0.0.2-py3-none-manylinux_2_28_x86_64.whl:

Publisher: python-release.yml on psychometrician/gog

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file gog-0.0.2-py3-none-manylinux_2_28_aarch64.whl.

File metadata

  • Download URL: gog-0.0.2-py3-none-manylinux_2_28_aarch64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: Python 3, manylinux: glibc 2.28+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for gog-0.0.2-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c1a8fc435df555e50edb296630e6203d521107c5bd69a4a2f1581992a2799506
MD5 76d794ed7b06e846c22c9b567bbeef0c
BLAKE2b-256 a1aa18f1e6a19bba0cf251080cab721f224eb98fed1ab0f7b3ea3c8d2d56171b

See more details on using hashes here.

Provenance

The following attestation bundles were made for gog-0.0.2-py3-none-manylinux_2_28_aarch64.whl:

Publisher: python-release.yml on psychometrician/gog

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file gog-0.0.2-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: gog-0.0.2-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for gog-0.0.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 130f486f63aa95cb485898bcaa7df036992b86b3acd9610f462048468451b8c0
MD5 8eff2d9548fe672fb04e500d633d7dc6
BLAKE2b-256 d2afde14c5784f86786982d819ac40b4c4a1619880aef07cdcd29645b697d059

See more details on using hashes here.

Provenance

The following attestation bundles were made for gog-0.0.2-py3-none-macosx_11_0_arm64.whl:

Publisher: python-release.yml on psychometrician/gog

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file gog-0.0.2-py3-none-macosx_10_12_x86_64.whl.

File metadata

  • Download URL: gog-0.0.2-py3-none-macosx_10_12_x86_64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: Python 3, macOS 10.12+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for gog-0.0.2-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c55ba14464289c6885515929e8a52bd8273170ddb986096e3608ac53367b45d7
MD5 343bc817643560d3327671530e31ef36
BLAKE2b-256 fd419415efc70fb3d6fdca7fa4a36ad4635b587a04f9285aec07a627f7bf0bb2

See more details on using hashes here.

Provenance

The following attestation bundles were made for gog-0.0.2-py3-none-macosx_10_12_x86_64.whl:

Publisher: python-release.yml on psychometrician/gog

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page