Matplotlib多图在Tkinter框架中尺寸适配与对齐问题求助
Tkinter嵌入Matplotlib图表的对齐修复方案
在开发基于CustomTkinter的程序时,嵌入4张Matplotlib图表后出现对齐异常:调整figsize要么导致图表超出容器,要么内容显示不全,以下是针对性的解决方案:
核心修复思路
- 匹配图表尺寸与容器:根据容器像素尺寸结合Matplotlib默认DPI(100)计算精准
figsize,同时启用自动布局避免内容裁剪 - 改用grid精确控制排列:用grid布局替代pack,通过列权重配置让图表平分容器宽度,保证对齐一致性
- 统一布局参数:所有图表使用相同的尺寸与布局规则,确保视觉统一
修改后的完整代码
import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from customtkinter import CTk, CTkFrame, FALSE aaaa = { 0:0, 5:5, 10:10, 15:15, } bbbb = { 0:0, 5:5, 16:13, 20:27, } # 根据容器尺寸计算适配的figsize:容器宽669px平分给两个图表,高305px,减去边距预留空间 fig_size = (3.0, 2.7) fig1, ax1 = plt.subplots(figsize=fig_size) ax1.plot(list(aaaa.keys()), list(aaaa.values())) ax1.set_title("Roket İrtifa") ax1.set_ylabel("metre") ax1.set_xlabel("Zaman / saniye") # 自动调整标题、轴标签与绘图区域的间距,避免内容裁剪 fig1.tight_layout() fig2, ax2 = plt.subplots(figsize=fig_size) ax2.plot(list(bbbb.keys()), list(bbbb.values())) ax2.set_title("İrtifa") ax2.set_ylabel("metre") ax2.set_xlabel("Zaman / saniye") fig2.tight_layout() app = CTk() app.resizable(FALSE, FALSE) right_frame = CTkFrame(master=app, width=670, height=610) right_frame.grid(column=1, row=1, sticky="nsew", rowspan=2, padx=(0, 20)) right_frame.grid_propagate(False) upper_frame = CTkFrame(master=right_frame, width=669, height=305) upper_frame.grid(column=0, row=0, sticky="nsew") upper_frame.grid_propagate(False) # 配置grid列权重,让两列平分容器宽度 upper_frame.grid_columnconfigure(0, weight=1) upper_frame.grid_columnconfigure(1, weight=1) canvas1 = FigureCanvasTkAgg(fig1, master=upper_frame) canvas1.draw() canvas1.get_tk_widget().grid(column=0, row=0, sticky="nsew", padx=2, pady=2) canvas2 = FigureCanvasTkAgg(fig2, master=upper_frame) canvas2.draw() canvas2.get_tk_widget().grid(column=1, row=0, sticky="nsew", padx=2, pady=2) lower_frame = CTkFrame(master=right_frame, width=669, height=305) lower_frame.grid(column=0, row=1, sticky="nsew") lower_frame.grid_propagate(False) # 同upper_frame配置grid列权重 lower_frame.grid_columnconfigure(0, weight=1) lower_frame.grid_columnconfigure(1, weight=1) canvas3 = FigureCanvasTkAgg(fig1, master=lower_frame) canvas3.draw() canvas3.get_tk_widget().grid(column=0, row=0, sticky="nsew", padx=2, pady=2) canvas4 = FigureCanvasTkAgg(fig2, master=lower_frame) canvas4.draw() canvas4.get_tk_widget().grid(column=1, row=0, sticky="nsew", padx=2, pady=2) app.mainloop()
关键修改说明
figsize计算:容器宽度669px平分给两个图表,结合默认DPI=100换算成英寸单位,减去0.3的边距预留空间,避免图表超出容器tight_layout():自动调整标题、轴标签与绘图区域的间距,彻底解决内容被裁剪的问题- grid布局配置:通过
grid_columnconfigure设置列权重为1,让两个图表平分容器宽度;sticky="nsew"让图表填满所在单元格,保证对齐整齐 - 边距优化:添加少量
padx/pady让图表之间留有间隙,提升视觉美观度
内容的提问来源于stack exchange,提问作者wBishoop
相关产品推荐
相关产品推荐

