Tufte-style plots from Berlin.
This package creates clean and beautiful plots that work on light and dark backgrounds.
Simply select the dufte style and, if desired, call dufte.legend() to get
line annotations on the right.
import matplotlib.pyplot as plt
import dufte
import numpy
plt.style.use(dufte.style)
numpy.random.seed(0)
x0 = numpy.linspace(0.0, 3.0, 100)
y0 = x0 / (x0 + 1)
y0 += 0.1 * numpy.random.rand(len(y0))
plt.plot(x0, y0, label="no balacing")
x1 = numpy.linspace(0.0, 3.0, 100)
y1 = 1.5 * x1 / (x1 + 1)
y1 += 0.1 * numpy.random.rand(len(y1))
plt.plot(x1, y1, label="CRV-27")
x2 = numpy.linspace(0.0, 3.0, 100)
y2 = 1.6 * x2 / (x2 + 1)
y2 += 0.1 * numpy.random.rand(len(y2))
plt.plot(x2, y2, label="CRV-27*")
dufte.legend()
plt.show()Further reading:
Background
The position $x_i$ of the line annotations is computed as the solution of a non-negative least-squares problem $$ \begin{align} \frac{1}{2}\sum_i (x_i - t_i)^2 \to \min_x,\\ (x_i - x_j)^2 \ge a^2 \quad \forall i,j. \end{align} $$ where $a$ is the minimum distance between two entries and $t_i$ is the target position.
Testing
To run the dufte unit tests, check out this repository and type
pytest
License
This software is published under the GPLv3 license.