使用matplotlib按钮在我创建的图之间切换/切换

时间:2017-11-20 00:35:18

标签: python matplotlib

所以我使用python 3.5中的matplotlib库创建了几个图表,但我希望能够灵活地利用按钮在我在单个窗口中创建的视图之间切换。我一直试图尝试一个例子here,但没有成功。我很好奇如何灵活点击我创建的不同视图。

我的代码有点像这样组织:

def plot1(data1, 'name1'):
    ...
    ax.plot(x,y)
    plt.draw()

def plot2(data2, 'name2'):
    ...
    ax2.plot(x,y)
    plt.draw()

def plot3(data3, 'name3'):
    ...
    ax3.plot(x,y)
    plt.draw()


plot1(data1,'name1')
plot2(data2,'name2')
plot3(data3,'name3')

plt.show()

目前它将出现在三个不同的窗口中。现在,当我尝试通过按钮将所有内容整合到一个视图中时,我无法这样做,因为坦率地说,我不熟悉如何在我的方法中传递变量以使用回调函数创建我想要的子图。有没有办法对我的代码进行排序,让它们都在一个matplotlib窗口下运行?

1 个答案:

答案 0 :(得分:2)

以下是使用您创建的函数的类。那些实际上不会绘制任何东西,但提供所需的数据。它们应放在名为funcs的列表中,当您单击next或prev时,会弹出相应的图形。这应该可以帮到你。

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


fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.2)
x = range(-50,50)
y = range(-50,50)

l, = plt.plot(x, y, lw=2)
ax.title.set_text('y = x')

class Index(object):
    ind = 0
    global funcs # used so yu can access local list, funcs, here
    def next(self, event):
        self.ind += 1 
        i = self.ind %(len(funcs))
        x,y,name = funcs[i]() # unpack tuple data
        l.set_xdata(x) #set x value data
        l.set_ydata(y) #set y value data
        ax.title.set_text(name) # set title of graph
        plt.draw()

    def prev(self, event):
        self.ind -= 1 
        i  = self.ind %(len(funcs))
        x,y, name = funcs[i]() #unpack tuple data
        l.set_xdata(x) #set x value data
        l.set_ydata(y) #set y value data
        ax.title.set_text(name) #set title of graph
        plt.draw()

def plot1():
    x = range(-20,20)
    y = x
    name = "y = x"
    return (x,y, name)

def plot2():
    x = range(-20,20)
    y = np.power(x, 2)
    name = "y = x^2"
    return (x,y,name)

def plot3():
    x = range(-20,20) # sample data
    y = np.power(x, 3)
    name = "y = x^3"
    return (x,y, name) 


funcs = [plot1, plot2, plot3] # functions in a list so you can interate over
callback = Index()
axprev = plt.axes([0.7, 0.05, 0.1, 0.075])
axnext = plt.axes([0.81, 0.05, 0.1, 0.075])
bnext = Button(axnext, 'Next')
bnext.on_clicked(callback.next)
bprev = Button(axprev, 'Previous')
bprev.on_clicked(callback.prev)

plt.show()