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

在Tkinter中嵌入Matplotlib图表时轴标签显示不全的问题

解决Tkinter嵌入Matplotlib时X轴标签被截断的问题

你遇到的X轴标签被截断,是因为Matplotlib默认布局没有为轴标签预留足够空间,结合Tkinter的容器布局限制,导致底部内容被遮挡。以下是几种可行的解决方式:

方法1:使用tight_layout自动调整布局

在创建完图表元素后,调用figure.tight_layout(),Matplotlib会自动计算并调整子图、标题、轴标签之间的间距,确保所有元素都显示完整。

修改后的核心代码片段:

fig1 = plt.figure(figsize=(3.5, 3), dpi=100)
ax1: Axes = fig1.add_subplot(111)
ax1.plot(x_data, y_data, "b-")
ax1.set_title("Plot Title")
ax1.set_xlabel("X axis Label")
ax1.set_xlim([0, 3])
ax1.set_ylabel("Y axis Label")
ax1.set_ylim([0, 9])

# 添加这行代码自动调整布局
fig1.tight_layout()

方法2:手动调整子图边距

如果需要更精细的控制,可以用subplots_adjust()手动设置底部边距,给X轴标签留出足够空间:

# 调整底部边距,数值可根据实际情况微调
fig1.subplots_adjust(bottom=0.18)

方法3:优化Tkinter容器的布局配置

当前代码中canvas仅左上角对齐容器,没有利用可用空间。可以修改布局规则,让canvas填充整个容器:

fig1_canvas = FigureCanvasTkAgg(fig1, self.report_frame)
# 让canvas填充整个网格单元格
fig1_canvas.get_tk_widget().grid(row=0, column=0, sticky="nsew")
# 配置容器的行列权重,支持canvas扩展
self.report_frame.grid_rowconfigure(0, weight=1)
self.report_frame.grid_columnconfigure(0, weight=1)

完整修改后的代码示例

import os
import tkinter as tk
from tkinter import ttk

import matplotlib
from matplotlib import pyplot as plt
from matplotlib.axes import Axes
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg


if os.environ.get("DISPLAY") is not None:
    matplotlib.use("TkAgg")


class MyGUI(ttk.Frame):
    def __init__(self, parent):
        ttk.Frame.__init__(self)

        x_data = [0, 0.5, 1, 1.5, 2, 2.5, 3]
        y_data = [0, 0.25, 1, 2.25, 4, 6.25, 9]

        self.report_frame = ttk.Frame(self, padding=(20, 10))
        self.report_frame.pack(expand=1, fill="both")
        fig1 = plt.figure(figsize=(3.5, 3), dpi=100)
        ax1: Axes = fig1.add_subplot(111)
        ax1.plot(x_data, y_data, "b-")
        ax1.set_title("Plot Title")
        ax1.set_xlabel("X axis Label")
        ax1.set_xlim([0, 3])
        ax1.set_ylabel("Y axis Label")
        ax1.set_ylim([0, 9])

        # 自动调整布局,确保标签完整显示
        fig1.tight_layout()

        fig1_canvas = FigureCanvasTkAgg(fig1, self.report_frame)
        # 让canvas填充整个网格单元格
        fig1_canvas.get_tk_widget().grid(row=0, column=0, sticky="nsew")
        # 配置行列权重,支持扩展
        self.report_frame.grid_rowconfigure(0, weight=1)
        self.report_frame.grid_columnconfigure(0, weight=1)


if __name__ == "__main__":
    root = tk.Tk()
    root.title("Plot Test")

    app = MyGUI(root)
    app.pack(expand=1, fill="both")  # 让主框架也能扩展
    root.mainloop()

内容的提问来源于stack exchange,提问作者Jacob F.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:18:27