A Python toolkit for producing publication-quality microeconomics diagrams. Define utility functions declaratively, solve for consumer equilibria, and export figures as PNG, PDF, SVG, or pure TikZ — all in a few lines of code.
Installation
pip install econ-viz
Requires Python 3.10 or later.
Quick Start
from econ_viz import Canvas, levels, solve
from econ_viz.models import CobbDouglas
model = CobbDouglas(alpha=0.5, beta=0.5)
eq = solve(model, px=2.0, py=3.0, income=30.0)
lvls = levels.around(eq.utility, n=5)
cvs = Canvas(x_max=20, y_max=15, x_label="x", y_label="y",
title="Cobb-Douglas $x^{0.5} y^{0.5}$")
cvs.add_utility(model, levels=lvls)
cvs.add_budget(2.0, 3.0, 30.0, fill=True)
cvs.add_equilibrium(eq, show_ray=True)
cvs.save("cobb_douglas.png")
TikZ export writes a standalone LaTeX document with only TikZ drawing commands:
cvs.save("cobb_douglas.tex", tikz_scale=0.0125)
The default TikZ scale maps a 6 inch wide Matplotlib figure to about 7.5 cm.
Notebook
The project ships with an interactive playground notebook:
notebook/econ-viz Playground.ipynb
Download it and open it in Jupyter, VS Code, or Colab. The first code cell upgrades econ-viz from PyPI for fresh runtimes.
Highlights
- Built-in models: Cobb-Douglas, Leontief, Perfect Substitutes, CES, Satiation, Quasi-Linear, Stone-Geary, and Translog
- Solver support for interior, kink, boundary, and corner solutions
- Closed-form demand helpers with
solution_tex(...) - Comparative tools including
comparative_statics(...)andslutsky_matrix(...) - Multi-panel
Figurelayouts,PricePath/IncomePath, and linkedDemandDiagram - CLI support for plotting and closed-form demand output
- Color-blind-friendly default palette (
themes.COLORBLIND_CYCLE_RGB) sourced from thriveth/8560036, with related citation at DOI:10.1080/00220485.1996.10844911
Additional Tools
Axis labels can be placed around their arrowheads, and each axis can use its own arrowhead style and line style (solid, dashed, dotted, or dashdot):
from econ_viz import ArrowStyle, Canvas, LabelPosition, LineStyle
canvas = Canvas(
x_label_pos=LabelPosition.TOP,
y_label_pos=LabelPosition.RIGHT,
x_arrow_style=ArrowStyle.SIMPLE,
y_arrow_style=ArrowStyle.WEDGE,
x_line_style=LineStyle.DASHED,
)
Every line can be restyled with a Stroke: width, line style, colour, and an
arrowhead at its end. Fields you leave out keep the theme default (see the
*_stroke defaults on Theme, such as theme.budget_stroke):
from econ_viz import ArrowStyle, Stroke
canvas = Canvas(axis_stroke=Stroke(width=1.4, arrow=ArrowStyle.SIMPLE))
canvas.add_budget(2, 3, 30, stroke=Stroke(width=3, style="dashed"))
canvas.add_equilibrium(eq, drop_stroke=Stroke(style="dashdot"))
canvas.add_ray(0.5, stroke=Stroke(arrow=ArrowStyle.TRIANGLE))
add_utility, add_path, add_decomposition, DemandDiagram, and
EdgeworthBox take one *_stroke argument per kind of line they draw.
Set a font for one canvas or a whole multi-panel figure without touching
Matplotlib's global settings. Pass a family name, a generic family such as
"serif", or a fallback list:
from econ_viz import Figure, Layout
canvas = Canvas(font=["Times New Roman", "serif"], math_font="stix")
figure = Figure(Layout.SIDE_BY_SIDE, font="serif", math_font="stix")
font applies to titles, axis labels, annotations, curve labels, and legends.
Math text, including the default axis labels, uses math_font: "stix"
(Times-like), "cm" (Computer Modern), "dejavuserif", "dejavusans", or
"stixsans". An unavailable font raises
InvalidParameterError. TikZ output uses the LaTeX document's fonts, so only
generic families are mapped (serif → \rmfamily, monospace → \ttfamily).
Closed-form Marshallian demand in TeX:
from econ_viz import solution_tex
from econ_viz.models import CobbDouglas
tex = solution_tex(CobbDouglas(alpha=0.4, beta=0.6))
Slutsky matrix:
from econ_viz import slutsky_matrix
from econ_viz.models import CobbDouglas
S = slutsky_matrix(CobbDouglas(alpha=0.4, beta=0.6), px=2.0, py=3.0, income=60.0)
# S.s_xx, S.s_xy, S.s_yx, S.s_yy
CLI
econ-viz --version
econ-viz help
econ-viz models
econ-viz solve-tex --model cobb-douglas --symbolic-params
Plotting example:
econ-viz plot --model cobb-douglas --alpha 0.5 --beta 0.5 \
--px 2 --py 3 --income 30 \
--fill --show-ray \
--output cobb_douglas.png
Documentation
Full documentation lives at econ-viz.org.
License
MIT © Anthony Sung
Release files for econ-viz 1.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| econ_viz-1.7.0.tar.gz | 79.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| econ_viz-1.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 189.6 kB
Release files / econ_viz-1.7.0.tar.gz
| Download URL | econ_viz-1.7.0.tar.gz |
|---|---|
| Size | 79.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9b40f427ae31fcae65013a5c189b0aa5a79c27c84be6917f9825bce3bbb14131
|
|
BLAKE2b-256 checksum How to use checksums |
2c1c09b9c5c28a09a026952db64eaaba04ed131ba1cb5bc888ff9131a5485649
|
| 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 Sep 25, 2026.
Transparency logRelease files / econ_viz-1.7.0-py3-none-any.whl
| Download URL | econ_viz-1.7.0-py3-none-any.whl |
|---|---|
| Size | 109.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7e7e28efe4e129161b2b49c61ce064aabfbb7ef41e2bccba86f10be163e7bc18
|
|
BLAKE2b-256 checksum How to use checksums |
da82a7fd02a6e11dcd55804fb69c3fd91d8913dece198fe761e91998360f70e5
|
| 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 Sep 25, 2026.
Transparency log