滑块matplotlib上的垂直彩色线条

时间:2017-07-31 19:53:58

标签: python matplotlib tkinter slider

我正在使用python-tkinter模块构建GUI,并使用plt.figure嵌入了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创建,但同样的功能在嵌入画布的matplotlib图中不起作用。

我想复制画布中嵌入式绘图中底部滑块的垂直线条!任何帮助将非常感激!谢谢!

slider vertical lines

1 个答案:

答案 0 :(得分:1)

Slider位于barpos,而不是self.ax 如果您致电self.ax.axvline(..),则axvline将位于self.ax内,这是带有条形的子图。 如果要在滑块轴上使用axvlines,则需要调用barpos.axvline()。更好地使barpos成为一个类变量,然后调用

self.barpos.axvline()