如何在tkinter中实时控制各个matplotlib子图的x轴刻度?
这是我第一次在stackoverflow发帖,所以我会尽量把事情说清楚...
我在用python运行一个数据采集模块,它的输入数据流来自另一个python模块。使用Tkinter的滑块来控制:图表的x轴比例(这个图表是用来绘制输入数据的),还有“生成速度”。
for axisnum in range( len( subplots ) ):
wScale = Tkinter.Scale( master = roots[root],
label = "View Width on Plot %s:" % ( axisnum ),
from_ = 3, to = 1000,
orient = Tkinter.HORIZONTAL,
sliderlength = 30,
length = subplots[axisnum].get_frame().get_window_extent().width,
)
wScale2 = Tkinter.Scale( master = roots[root],
label = "Generation Speed for Plot %s:" % ( axisnum ),
from_ = 1, to = 200,
orient = Tkinter.HORIZONTAL,
sliderlength = 30,
length = subplots[axisnum].get_frame().get_window_extent().width
)
wScale2.pack( side = Tkinter.BOTTOM )
wScale.pack( side = Tkinter.BOTTOM )
wScale.set( 100 )
wScale2.set( wScale2['to'] - 3 )
问题是,虽然这样在画布上创建了所有的'n'个滑块,但实际上只有第一个滑块是有效的,而且它还像个“主滑块”,同时控制所有的'n'个子图。
稍微修改了一下后,出现了“x和y数据长度必须相同”的错误。
所以,有没有什么建议可以让我创建Tkinter滑块,来控制单个子图的x轴比例,而不是所有子图一起控制呢?
更新
也许问题出在我的实时绘图模块上?
注意:dsets[Figure][subs][data]可以获取特定子图的数据点;subs通常应该保持为'0'。
def RealtimePlotter():
global dsets, wScalesList, wScales2List
for i in range(len(Figures_List)):
for Scale in wScalesList:
Samples = min(len(dsets[i][0][0]),Scale[0].get())
XAxis = pylab.arange(len(dsets[i][0][0])-Samples,
len(dsets[i][0][0], 1
)
for t in range(len(linenum)-1):
#we choose lineax and axnum[1] because [0] is just the figure number
(lineax[t+1])[i].set_data(XAxis,pylab.array(dsets[i][0][t][-Samples:])
(axinfo[t+1]).axis([XAxis.min(),Xaxis.max(),-1.5,1.5])
for canvas in range(len(canvasList)):
canvasList[canvas].draw()
for root in range(len(roots)):
roots[root].after(100,RealtimePlotter)
1 个回答
0
下面的例子没有问题,所以你的代码里一定有我无法复制的地方。当你说“画布”时,滑块是在一个画布对象上,还是只是说说而已?另外,roots[root]是什么类型的对象?
“只有第一个实际上是活跃的,并且它还充当一个‘主滑块’,同时控制所有‘n’个子图。”我认为这只有在它们都指向同一个对象时才有可能。
import Tkinter
root=Tkinter.Tk()
root.geometry("225x150")
for slide_length in (200, 150):
wScale = Tkinter.Scale( master = root,
label = "View Width on Plot ",
from_ = 3, to = 1000,
orient = Tkinter.HORIZONTAL,
sliderlength = 30,
length = slide_length)
wScale.pack(side = Tkinter.BOTTOM)
root.mainloop()