How to switch between diagrams with a button in Matplotlib

ぐ巨炮叔叔 提交于 2019-12-13 20:56:25

问题


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


回答1:


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()



回答2:


For those, who want to switch between bar- or plot diagrams (works for both types of diagram). I also think it is much cleaner to do it this way.

import matplotlib.pyplot as plt
from matplotlib.widgets import Button


class Index(object):

    def start(self, event=None):
        ax.clear()
        x_values = [1, 2, 3, 4, 5]
        y_values = [3, 5, 2, 19, 1]
        ax.bar(x_values, y_values)
        plt.draw()

    def next(self, event):
        ax.clear()
        x_values = [1, 2, 3, 4, 5]
        y_values = [20, 15, 10, 5, 1]
        ax.bar(x_values, y_values)
        plt.draw()

    def prev(self, event):
        ax.clear()
        x_values = [1, 2, 3, 4, 5]
        y_values = [1, 5, 10, 15, 20]
        ax.bar(x_values, y_values)
        plt.draw()

ax  = plt.gca()
callback = Index()
callback.start()

axprev = plt.axes([0.59, 0.002, 0.1, 0.075])
bprev = Button(axprev, 'Previous')
bprev.on_clicked(callback.prev)
axstart = plt.axes([0.7, 0.002, 0.1, 0.075])
bstart = Button(axstart, 'Start')
bstart.on_clicked(callback.start)
axnext = plt.axes([0.81, 0.002, 0.1, 0.075])
bnext = Button(axnext, 'Next')
bnext.on_clicked(callback.next)

plt.show()


来源:https://stackoverflow.com/questions/53241759/how-to-switch-between-diagrams-with-a-button-in-matplotlib

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!