Some useful extensions for Matplotlib.
Install with
pip install matplotx
and use in Python with
import matplotx
See below for what matplotx can do.
Clean line plots (dufte)
matplotlib | matplotx.styles.dufte , matplotx.ylabel_top , matplotx.line_labels |
matplotx.styles.dracula | matplotx.styles.dufte |
The middle plot is created with
import matplotlib.pyplot as plt
import matplotx
import numpy as np
# create data
rng = np.random.default_rng(0)
offsets = [1.0, 1.50, 1.60]
labels = ["no balancing", "CRV-27", "CRV-27*"]
x0 = np.linspace(0.0, 3.0, 100)
y = [offset * x0 / (x0 + 1) + 0.1 * rng.random(len(x0)) for offset in offsets]
# plot
with plt.style.context(matplotx.styles.dufte):
for yy, label in zip(y, labels):
plt.plot(x0, yy, label=label)
plt.xlabel("distance [m]")
matplotx.ylabel_top("voltage [V]") # move ylabel to the top, rotate
matplotx.line_labels() # line labels to the right
plt.show()
The three matplotx ingredients are:
matplotx.styles.dufte
: A minimalistic stylematplotx.ylabel_top
: Rotate and move the the y-labelmatplotx.line_labels
: Show line labels to the right, with the line color
You can also combine dufte with any other style (see below) with
plt.style.use(matplotx.styles.dracula | matplotx.styles.dufte)
(This uses the Python 3.10 dict merge operator |
. If you're using an older Python version, you have to use, e.g., {**x, **y}
.)
Further reading and other styles:
Clean bar plots
matplotlib | dufte | dufte with matplotx.show_bar_values() |
The right plot is created with
import matplotlib.pyplot as plt
import matplotx
labels = ["Australia", "Brazil", "China", "Germany", "Mexico", "United\nStates"]
vals = [21.65, 24.5, 6.95, 8.40, 21.00, 8.55]
xpos = range(len(vals))
with plt.style.context(matplotx.styles.dufte_bar):
plt.bar(xpos, vals)
plt.xticks(xpos, labels)
matplotx.show_bar_values("{:.2f}")
plt.title("average temperature [°C]")
plt.show()
The two matplotx ingredients are:
matplotx.styles.dufte_bar
: A minimalistic style for bar plotsmatplotx.show_bar_values
: Show bar values directly at the bars
Extra styles
matplotx contains numerous extra color schemes, e.g., Dracula, Nord, gruvbox, and Solarized, the revised Tableau colors.
import matplotlib.pyplot as plt
import matplotx
# use everywhere:
plt.style.use(matplotx.styles.dracula)
# use with context:
with plt.style.context(matplotx.styles.dracula):
pass
Other styles:
- John Garrett, Science Plots
- Dominik Haitz, Cyberpunk style
- Dominik Haitz, Matplotlib stylesheets
- Carlos da Costa, The Grand Budapest Hotel
- Danny Antaki, vaporwave aesthetics
- QuantumBlack Labs, QuantumBlack
Contour plots for functions with discontinuities
plt.contour |
matplotx.contour(max_jump=1.0) |
Matplotlib has problems with contour plots of functions that have discontinuities. The software has no way to tell discontinuities and very sharp, but continuous cliffs apart, and contour lines will be drawn along the discontinuity.
matplotx improves upon this by adding the parameter max_jump
. If the difference between two function values in the grid is larger than max_jump
, a discontinuity is assumed and no line is drawn. Similarly, min_jump
can be used to highlight the discontinuity.
As an example, take the function imag(log(Z))
for complex values Z. Matplotlib's contour lines along the negative real axis are wrong.
import matplotlib.pyplot as plt
import numpy as np
import matplotx
x = np.linspace(-2.0, 2.0, 100)
y = np.linspace(-2.0, 2.0, 100)
X, Y = np.meshgrid(x, y)
Z = X + 1j * Y
vals = np.imag(np.log(Z))
# plt.contour(X, Y, vals, levels=[-2.0, -1.0, 0.0, 1.0, 2.0]) # draws wrong lines
matplotx.contour(X, Y, vals, levels=[-2.0, -1.0, 0.0, 1.0, 2.0], max_jump=1.0)
matplotx.discontour(X, Y, vals, min_jump=1.0, linestyle=":", color="r")
plt.gca().set_aspect("equal")
plt.show()
Relevant discussions:
License
This software is published under the MIT license.