Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interactive selection of series in a matplotlib plot

I have been looking for a way to be able to select which series are visible on a plot, after a plot is created.

I need this as i often have plots with many series. they are too many to plot at the same time, and i need to quickly and interactively select which series are visible. Ideally there will be a window with a list of series in the plot and checkboxes, where the series with the checked checkbox is visible.

Does anyone know if this has been already implemented somewhere?, if not then can someone guide me of how can i do it myself?

Thanks!

Omar

like image 753
omar Avatar asked Oct 15 '12 08:10

omar


2 Answers

It all depends on how much effort you are willing to do and what the exact requirements are, but you can bet it has already been implemented somewhere :-)

If the aim is mainly to not clutter the image, it may be sufficient to use the built-in capabilities; you can find relevant code in the matplotlib examples library:

  • http://matplotlib.org/examples/event_handling/legend_picking.html
  • http://matplotlib.org/examples/widgets/check_buttons.html

If you really want to have a UI, so you can guard the performance by limiting the amount of plots / data, you would typically use a GUI toolbox such as GTK, QT or WX. Look here for some articles and example code:

  • http://eli.thegreenplace.net/2009/05/23/more-pyqt-plotting-demos/
like image 178
Dirk Avatar answered Oct 04 '22 14:10

Dirk


A list with checkboxes will be fine if you have a few plots or less, but for more plots a popup menu would probably be better. I am not sure whether either of these is possible with matplotlib though.

The way I implemented this once was to use a slider to select the plot from a list - basically you use the slider to set the index of the series that should be shown. I had a few hundred series per dataset, so it was a good way to quickly glance through them.

My code for setting this up was roughly like this:

fig = pyplot.figure()
slax = self.fig.add_axes((0.1,0.05,0.35,0.05))
sl = matplotlib.widgets.Slider(slax, "Trace #", 0, len(plotlist), valinit=0.0)
def update_trace():
    ax.clear()
    tracenum = int(np.floor(sl.val))
    ax.plot(plotlist[tracenum])
    fig.canvas.draw()
sl.on_changed(update_trace)
ax = self.fig.add_axes((0.6, 0.2, 0.35, 0.7))
fig.add_subplot(axes=self.traceax)
update_trace()

Here's an example:

Plot image

like image 39
silvado Avatar answered Oct 04 '22 14:10

silvado