2017-07-31 93 views
0

我使用python-tkinter模塊構建了一個GUI,並使用plt.figure嵌入了matplotlib條形圖! 這裏是我的代碼:滑塊上的垂直彩色線條matplotlib

def graph(self): 
     f=plt.Figure(figsize=(40,4)) 
     canvas=FigureCanvasTkAgg(f,self.canvas) 
     canvas.get_tk_widget().pack(side=TOP,fill=BOTH,expand=True) 

     ax=f.add_subplot(111) 
     f.subplots_adjust(left=0.00, right=0.99) 

     self.x=range(1,100) #for example 
     self.y=[1]*len(self.x) 
     self.N=10 
     self.f=f 
     self.ax=ax 

     barpos=f.add_axes([0.18, 0.03, 0.55, 0.07], facecolor='white') 
     slider=Slider(barpos, 'Plot',0,len(self.x)-self.N, valinit=0) 
     self.slider=slider 
     slider.on_changed(self.bar) 
     self.bar(0) 


    def bar(self,pos): 
     pos=int(pos) 
     N=self.N 
     self.ax.clear() 
     if pos + N > len(self.x): 
      n=len(self.x)-pos 
     else: 
      n=N 
     X=self.x[pos:pos+n] 
     Y=self.y[pos:pos+n] 
     self.ax.bar(X,Y,width=0.7, align='edge',color='green',alpha=0.07) 
     self.ax.margins(0.01,0) 


     for i,txt in enumerate(self.x): 
      **self.ax.axvline(x= i, color='r')** #*this line if I use it without embedding my plot in tkinter gives me a slider with vertical lines as shown in bottom image but if I use it in my gui code it puts the lines on the bars and not on the slider* 

      self.ax.annotate(self.fid[i], (self.x[i],0.25),horizontalalignment='right',fontsize=8,color='purple',weight='bold') 

     #I am annotating a bunch of stuff here 

     self.ax.axes.xaxis.set_ticks([]) 
     self.ax.axes.yaxis.set_ticks([]) 

我一次顯示10條,我需要幫助與滑塊產生不同顏色的垂直線。

我能夠在matplotlib中實現此功能,其中我的圖形是在plt.subplots中創建的,而plt.axes用於代替f.add_axes。 任何人都可以幫我複製這是我的tkinter滑塊(使用f.add_axes創建)? 我添加了一個圖像,其中最上面的圖片顯示了我的滑塊如何嵌入tkinter畫布 中,並且最下面的圖片是使用plt.axvline創建的,但是同樣的功能在嵌入canvas中的matplotlib圖形中不起作用。

我想複製垂直線,就像在畫布的嵌入式陰謀的底部滑塊!任何幫助將非常感激!謝謝!

slider vertical lines

+1

在Tkinter畫布上繪製圖形或繪製圖形沒有區別。事實上,如果您使用Tk後端,通常的繪圖窗口*就是一個tkinter畫布。也就是說,如果您在執行代碼時遇到問題,則需要提供問題的[mcve]。 – ImportanceOfBeingErnest

回答

1

該滑塊位於barpos,而不是在self.ax
如果你打電話self.ax.axvline(..),axvline將在self.ax裏面,這是帶條的子圖。 如果要在Slider軸中使用axvlines,則需要致電barpos.axvline()。最好讓barpos變成一個班級變量,然後致電

self.barpos.axvline() 
+0

非常感謝!它解決了我的問題! :) 非常感謝! – cbhush