Matplotlib中Y轴字体增大失败,求解决方案(附代码)
解决Matplotlib Y轴字体无法增大的问题
问题根源
你的代码中,动画函数grafico_1和grafico_2每次执行都会重新绘制条形图,但未设置Y轴字体,且每次绘制前未清除原有轴内容——即使之前设置过字体,也会被新绘制的元素覆盖。另外,图表figsize=(10, 0.5)的高度过小,也会导致Y轴标签显示不明显。
修复方案
- 初始化时配置轴字体:创建子图后直接设置Y轴字体大小,避免动画更新时重复操作。
- 动画更新前清除轴内容:用
b1.clear()和b2.clear()清除原有元素,防止重叠并确保字体设置生效。 - 调整图表高度:适当增大
figsize的高度,给Y轴标签足够显示空间。
修改后的完整代码
import tkinter as tk import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib import animation import random # 创建Tkinter窗口 root = tk.Tk() root.geometry('1200x600') # 调整窗口尺寸适配图表 # 创建图表,增大高度以便显示Y轴字体 fig1, b1 = plt.subplots(figsize=(10, 2), dpi=80) # 初始化Y轴字体大小 b1.tick_params(axis='y', labelsize=14) fig2, b2 = plt.subplots(figsize=(10, 2), dpi=80) b2.tick_params(axis='y', labelsize=14) def grafico_1(i): global b1 x = [] y_fix = [] ws = ['WIRE'] for _ in range(1, 6): nume = random.randint(1, 10) x.append(nume) # 清除原有轴内容,避免重叠 b1.clear() # 清除后重新设置Y轴字体 b1.tick_params(axis='y', labelsize=14) # 绘制第一层条形 if int(x[0]) < 3: b1.barh(ws, int(x[0]), color='green') y_fix.append(int(x[0])) elif 3 <= int(x[0]) < 6: b1.barh(ws, int(x[0]), color='yellow') y_fix.append(x[0]) else: b1.barh(ws, int(x[0]), color='red') y_fix.append(x[0]) # 绘制后续层条形 for c in x[1:]: if int(c) < 3: b1.barh(ws, int(c), color='green', left=y_fix) elif 3 < int(c) < 5: b1.barh(ws, int(c), color='yellow', left=y_fix) else: b1.barh(ws, int(c), color='red', left=y_fix) # 更新left参数,简化列表操作 y_fix[0] += int(c) def grafico_2(i2): global b2 x2 = [] y_fix2 = [] ws2 = ['line 2'] for _ in range(1, 6): nume2 = random.randint(1, 10) x2.append(nume2) # 清除原有轴内容 b2.clear() # 重新设置Y轴字体 b2.tick_params(axis='y', labelsize=14) # 绘制第一层条形 if int(x2[0]) < 3: b2.barh(ws2, int(x2[0]), color='green') y_fix2.append(int(x2[0])) elif 3 <= int(x2[0]) < 6: b2.barh(ws2, int(x2[0]), color='yellow') y_fix2.append(x2[0]) else: b2.barh(ws2, int(x2[0]), color='red') y_fix2.append(x2[0]) # 绘制后续层条形 for c2 in x2[1:]: if int(c2) < 3: b2.barh(ws2, int(c2), color='green', left=y_fix2) elif 3 < int(c2) < 5: b2.barh(ws2, int(c2), color='yellow', left=y_fix2) else: b2.barh(ws2, int(c2), color='red', left=y_fix2) # 更新left参数 y_fix2[0] += int(c2) # 创建动画 ani1 = animation.FuncAnimation(fig1, grafico_1, interval=3000, frames=100) ani2 = animation.FuncAnimation(fig2, grafico_2, interval=3000, frames=100) # 将图表嵌入Tkinter窗口 canvas1 = FigureCanvasTkAgg(fig1, master=root) canvas1.get_tk_widget().place(x=50, y=50) canvas2 = FigureCanvasTkAgg(fig2, master=root) canvas2.get_tk_widget().place(x=50, y=200) root.mainloop()
关键修改说明
tick_params(axis='y', labelsize=14):直接设置Y轴刻度标签的字体大小,由于clear()会重置轴配置,所以清除轴后需要再次调用。b1.clear():每次动画更新前清除轴内容,避免多次绘制的条形图重叠,确保字体设置能正常生效。- 调整图表和窗口尺寸:原图表高度仅0.5,Y轴标签几乎无法显示,增大到2后可正常展示;同时调整Tkinter窗口大小,让图表完整显示。
- 简化
y_fix逻辑:将原有复杂的列表清空、重新创建操作简化为直接累加列表第一个元素,提升代码简洁性。
内容的提问来源于stack exchange,提问作者Jose Lotto
相关产品推荐
相关产品推荐

