关于python:如何在Matplotlib中用按钮切换图表

How to switch between diagrams with a button in Matplotlib

有没有简单的方法,用一个按钮在两个或多个图表之间切换?例如,我希望能够使用按钮在这两个图表之间切换,而不是一个接一个地显示它们。

1
2
3
4
5
6
7
8
9
10
11
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()

我知道有这个问题的例子,但我根本无法让它工作......

这是链接,他们在其中展示了如何操作,但我不明白如何操作...

链接:https://matplotlib.org/gallery/widgets/buttons.html


在这里,我修改了您提供的链接中的代码,以便它根据当前绘制的值使用不同的值集。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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()


对于那些想要在条形图或绘图之间切换的人(适用于两种类型的图表)。我也认为这样做更干净。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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()