2017-11-20 3 views
2

私はpython 3.5でmatplotlibライブラリを使用していくつかのチャートを作成しましたが、ビューIの間でボタンを使い分ける柔軟性を持たせたい1つのウィンドウ内に作成されます。私は例としてhereを実験しようとしてきましたが、成功していませんでした。私は、作成したさまざまなビューをクリックする柔軟性を持つ方法が不思議でした。matplotlibボタンを使って作成したプロットを交互に切り替える

私のコードは、ソートのこのよう構成されています

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

現在それは、3つの異なるウィンドウに表示されます。今私はボタンを介してアクセス可能な1つのビューにこれをしようとすると、コールバック関数を使って必要なサブプロットを作成する方法で変数を渡す方法がわかりません。それらをすべて1つのmatplotlibウィンドウの下で実行させるために、自分のコードを構造体に並べ替える方法はありますか?

答えて

1

以下は、作成した関数を使用するクラスです。それらは実際に何かをプロットしませんが、必要なデータを提供します。それらを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() 
関連する問題