Search code examples
pythonmatplotlibbuttondiagram

How to switch between diagrams with a button in Matplotlib


Is there an easy way, to switch between two or more diagrams with a button? I would like, for example be able to switch between these two diagrams with a button instead of showing them one after the other.

import matplotlib.pyplot as plt

x_values = [1, 2, 3, 4, 5]
y_values = [1, 4, 9, 16, 25]
plt.bar(x_values, y_values)
plt.show()

x_values = [5, 4, 3, 2, 1]
y_values = [1, 4, 9, 16, 25]
plt.bar(x_values, y_values)
plt.show()

I know there are examples for this problem out there, but I simply can't get it to work...

Here is the link, where they show how to do it, but I don't understand how to do it...

Link: https://matplotlib.org/gallery/widgets/buttons.html


Solution

  • Here I modified code from the link you supplied so that it uses different sets of values depending on what values are currently plotted.

    import matplotlib.pyplot as plt
    from matplotlib.widgets import Button
    
    x1_values = [1, 2, 3, 4, 5]
    y1_values = [1, 4, 9, 16, 25]
    l, = plt.plot(x1_values, y1_values)
    
    
    class Index(object):
        def __init__(self):
            self.current = 1
    
            self.x1 = [5, 4, 3, 2, 1]
            self.y1 = [1, 4, 9, 16, 25]
    
            self.x2 = [1, 2, 3, 4, 5]
            self.y2 = [1, 4, 9, 16, 25]
    
        def plot(self, x):
            self.current += 1
    
            if self.current%2:
                self.values1()
            else:
                self.values2()
    
        def values1(self):
            l.set_xdata(self.x1)
            l.set_ydata(self.y1)
            plt.draw()
    
        def values2(self):
            l.set_xdata(self.x2)
            l.set_ydata(self.y2)
            plt.draw()
    
    callback = Index()
    axnext = plt.axes([0.81, 0.05, 0.1, 0.075])
    bprev = Button(axnext, 'Switch')
    bprev.on_clicked(callback.plot)
    
    plt.show()