Interactive selection of series in a matplotlib plot

前端 未结 3 572
梦谈多话
梦谈多话 2020-12-31 13:43

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. t

相关标签:
3条回答
  • 2020-12-31 13:57

    Now that plot.ly has opened sourced their libraries, it is a really good choice for interactive plots in python. See for example: https://plot.ly/python/legend/#legend-names. You can click on the legend traces and select/deselect traces.

    If you want to embed in an Ipython/Jupyter Notebook, that is also straightforward: https://plot.ly/ipython-notebooks/gallery/

    0 讨论(0)
  • 2020-12-31 14:06

    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/
    0 讨论(0)
  • 2020-12-31 14:06

    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

    0 讨论(0)
提交回复
热议问题