Skip to content

Matplotlib Figure

matplotlib is one of the most widely used data visualization libraries. I guess most of the Python users know the basics of the library.

For data visualization of simple data set, your can use the Figure widget.

from magicclass.widgets import Figure

It has very simple API inherited from the original functions, such as plt.plot(x, y) or plt.xlim(0, 100). It also support interactive plot.

Basic Usage

If you are using Figure widget independent of magic-class, it's just like the usual matplotlib way.

# run "%gui qt" if needed
plt = Figure()
plt.plot(np.random.random(100))
plt.show()

Many functions defined in matplotlib.pyplot are also supported.

plt.xlim(-5, 5)  # change x-limits
plt.hist(np.random.normal(size=100), color="r")  # histogram
plt.imshow(np.random.random((64, 64)), cmap="gray")  # 2D image
plt.xlabel("X label")  # change x-label
plt.title("title")  # change title
plt.xticks([0, 1], ["start", "end"])  # change x-tick labels

If you want to clear the contents, call cla() method.

plt.cla()

Use Figure Widget in Magic Class

In most cases, you'll use field to create a matplotlib figure widget in your GUI.

from magicclass import magicclass, field

@magicclass
class Main:
    plt = field(Figure)

    def plot(self):
        self.plt.plot(np.random.random(100))

Use Multiple Axes

Sometimes we have to prepare multiple axes and plot different sets of data separately by using fig, ax = plt.subplots(2, 1) or other similar methods. The Figure widget also support multi-axes plotting. You can create a multi-axes widget by passing nrows and ncols arguments to it, like plt.subplots, and all the axes are accessible via axes attribute. However, since axes are the matplotlib's Axes object itself, you'll have to call draw method to update the figure.

plt = Figure(nrows=1, ncols=2)
plt.axes[0].plot([1, 2, 3])  # the first axis
plt.axes[1].plot([1, 4, 2])  # the second axis
plt.draw()  # update
@magicclass
class Main:
    plt = field(Figure, options={"nrows": 1, "ncols": 2})

Plot API

For the simplest usage, you can use plot_api submodule. Its API is almost identical to those in matplotlib.pyplot.

# instead of import matplotlib.pyplot as plt
import magicclass.plot_api as plt

plt.figure()
plt.plot([0, 1, 2, 3], [4, 2, 3, 1], color="red")
plt.show()

The current figure widget is available with gcw() function. It returns the magicclass.widgets.Figure widget.

# add figure to a widget.
from magicgui.widgets import Container

fig = plt.gcw()
cnt = Container(widgets=[fig])
cnt.show()