matplotlib:如何使用可滚动的 figurecanvastkagg 制作适当数量的子图 window
matplotlib: how to make proper higher number of subplots with figurecanvastkagg in scrollable window
我正在尝试制作一个用户界面,为我的同事显示一些带滚动条的图表,但我陷入了代码的最后一部分。
逻辑:
使用 main window,他们可以为 运行 添加文件。当他们 运行 代码时,情节将显示在不同框架的主要 window 下。
大约,他们为每个 运行 使用 20-30 个文件,它显示大约 20-30 个图表。
我以有点混乱的方式创建了所有内容,但它正在运行。然而,当子图的数量很高(>10)时,图看起来像是被挤压在屏幕的顶部,而底部几乎是空的。几周来我一直在努力寻找答案,但我找不到很好的解决方案,即使我看到了与我类似的问题并且我想再问一次。
那么在这种情况下如何避免压扁地块。
注意:我在"FigureCanvasTkAgg"中使用了resize_callback它以某种方式解决了我的问题,但我无法在 window 中正确使用 NavigationToolbar2Tk 功能。
国王问好,
这是我的代码:
def gui():
...
...
def func():
fig, axs=plt.subplots(nrows=len(files),ncols=1,figsize=(20,10*len(fsa_file)), dpi=100, squeeze=False)
fig.subplots_adjust(hspace=0.5)
axs=axs.ravel()
w,h=fig.get_size_inches()
for v in range(files):
...(other things)
...
...
axs[v].plot(cb_blue, color="blue")
axs[v].plot(cb_green, color="green")
axs[v].plot(cb_black, color="black")
axs[v].plot(cb_red, color="red")
axs[v].set_title(files[v].split("/")[6].split(".")[0])
frame_Agg =Frame(root, width=(20* (fig.dpi)), height=(h * (fig.dpi)))
canvas=Canvas(frame_Agg,width=(20* (fig.dpi)), height=(h * (fig.dpi)))
yScrollbar = Scrollbar(root, orient=VERTICAL)
yScrollbar.pack(side=RIGHT, fill=Y)
figAgg = FigureCanvasTkAgg(fig,canvas)
figAgg.get_tk_widget().config(width=(20* (fig.dpi)), height=(h (fig.dpi)))
figAgg.get_tk_widget().config(yscrollcommand=yScrollbar.set)
figAgg.get_tk_widget().config(scrollregion=(0,0, 20 * fig.dpi, h * fig.dpi))
yScrollbar.config(command=figAgg.get_tk_widget().yview)
figAgg.get_tk_widget().pack(side=tkinter.TOP,fill=tkinter.BOTH,expand=1)
toolbar = NavigationToolbar2Tk(figAgg, frame_Agg)
toolbar.update()
figAgg.draw()
frame_Agg.pack()
canvas.pack()
return func
def main():
gui()
main()
我通过使用 grid() 参数解决了我自己的问题。
我正在尝试制作一个用户界面,为我的同事显示一些带滚动条的图表,但我陷入了代码的最后一部分。
逻辑:
使用 main window,他们可以为 运行 添加文件。当他们 运行 代码时,情节将显示在不同框架的主要 window 下。
大约,他们为每个 运行 使用 20-30 个文件,它显示大约 20-30 个图表。
我以有点混乱的方式创建了所有内容,但它正在运行。然而,当子图的数量很高(>10)时,图看起来像是被挤压在屏幕的顶部,而底部几乎是空的。几周来我一直在努力寻找答案,但我找不到很好的解决方案,即使我看到了与我类似的问题并且我想再问一次。
那么在这种情况下如何避免压扁地块。
注意:我在"FigureCanvasTkAgg"中使用了resize_callback它以某种方式解决了我的问题,但我无法在 window 中正确使用 NavigationToolbar2Tk 功能。
国王问好,
这是我的代码:
def gui():
...
...
def func():
fig, axs=plt.subplots(nrows=len(files),ncols=1,figsize=(20,10*len(fsa_file)), dpi=100, squeeze=False)
fig.subplots_adjust(hspace=0.5)
axs=axs.ravel()
w,h=fig.get_size_inches()
for v in range(files):
...(other things)
...
...
axs[v].plot(cb_blue, color="blue")
axs[v].plot(cb_green, color="green")
axs[v].plot(cb_black, color="black")
axs[v].plot(cb_red, color="red")
axs[v].set_title(files[v].split("/")[6].split(".")[0])
frame_Agg =Frame(root, width=(20* (fig.dpi)), height=(h * (fig.dpi)))
canvas=Canvas(frame_Agg,width=(20* (fig.dpi)), height=(h * (fig.dpi)))
yScrollbar = Scrollbar(root, orient=VERTICAL)
yScrollbar.pack(side=RIGHT, fill=Y)
figAgg = FigureCanvasTkAgg(fig,canvas)
figAgg.get_tk_widget().config(width=(20* (fig.dpi)), height=(h (fig.dpi)))
figAgg.get_tk_widget().config(yscrollcommand=yScrollbar.set)
figAgg.get_tk_widget().config(scrollregion=(0,0, 20 * fig.dpi, h * fig.dpi))
yScrollbar.config(command=figAgg.get_tk_widget().yview)
figAgg.get_tk_widget().pack(side=tkinter.TOP,fill=tkinter.BOTH,expand=1)
toolbar = NavigationToolbar2Tk(figAgg, frame_Agg)
toolbar.update()
figAgg.draw()
frame_Agg.pack()
canvas.pack()
return func
def main():
gui()
main()
我通过使用 grid() 参数解决了我自己的问题。