You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键修改说明

  1. figsize计算:容器宽度669px平分给两个图表,结合默认DPI=100换算成英寸单位,减去0.3的边距预留空间,避免图表超出容器
  2. tight_layout():自动调整标题、轴标签与绘图区域的间距,彻底解决内容被裁剪的问题
  3. grid布局配置:通过grid_columnconfigure设置列权重为1,让两个图表平分容器宽度;sticky="nsew"让图表填满所在单元格,保证对齐整齐
  4. 边距优化:添加少量padx/pady让图表之间留有间隙,提升视觉美观度

内容的提问来源于stack exchange,提问作者wBishoop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:05:37