如何将matplotlib生成的图表精准放置到Tkinter窗口的指定坐标位置
问题核心原因
- 混用了Tkinter的两种布局管理器:
moveto()属于place绝对定位布局的方法,调用后又执行pack()布局,pack规则会直接覆盖你设置的坐标参数,导致位置失效。 - 你设置的
pack(side="left")和pack(side="right")会让两个画布分别贴靠窗口左右边缘,自然无法对齐到指定的x=69、x=481的目标位置。 - 第二个饼图额外添加的图例,会占用画布外部空间,导致实际显示尺寸和你预设的3.99*2.72英寸不符,进一步加剧偏移。
修复方案
完全放弃pack布局,直接用place做绝对定位即可,同时调整饼图图例位置避免挤占画布尺寸,修改后的代码如下:
import tkinter from matplotlib.figure import Figure from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import matplotlib.path as mpath # 初始化窗口,根据你实际的窗口尺寸调整geometry参数 window = tkinter.Tk() window.geometry("900x600") # 生成第一个折线图 fig = Figure(dpi=100) fig.set_size_inches(3.99, 2.72, forward=True) # 可按需调整subplot边距,减少不必要的空白 fig.subplots_adjust(left=0.15, right=0.95, top=0.9, bottom=0.15) fig.add_subplot(111).plot( ['Juni', 'Test', 'Yessir'], [1, 3254, 235], marker=mpath.Path.unit_circle(), markersize=5 ) canvas = FigureCanvasTkAgg(fig, master=window) # 直接用place定位,不要调用pack canvas.get_tk_widget().place(x=481, y=222) # 生成第二个饼图 abteilungen = ['Editing', 'Web Entwicklung', '3D Modeling', 'NFT', 'Office'] anteile = [15,25,40,10,11] fig2 = Figure(dpi=100) fig2.set_size_inches(3.99, 2.72, forward=True) fig2.subplots_adjust(left=0.15, right=0.95, top=0.9, bottom=0.15) ax = fig2.add_subplot(111) ax.pie(anteile, radius=1, labels=abteilungen, autopct='%0.2f%%') # 图例放在图内,避免额外占用画布宽度 fig2.legend(loc='lower right', bbox_to_anchor=(0.9, 0.1)) chart1 = FigureCanvasTkAgg(fig2, master=window) # 直接用place定位,不要调用pack chart1.get_tk_widget().place(x=69, y=222) window.mainloop()
如果仍有轻微位置偏差,可微调place的x/y坐标,或者调整set_size_inches的尺寸参数即可。
内容的提问来源于stack exchange,提问作者Dennis van den Brock
相关产品推荐
相关产品推荐

