本文详解如何在单个 tkinter canvas 上同时绘制多个数学函数图像,通过坐标系校准、函数封装与颜色区分实现多图共存,并提供可复用的绘图函数模板。
在 Tkinter 中使用 Canvas 绘制数学函数图像时,若想在同一画布上叠加多个函数(如 $y = x^2$、$y = \sin(x)$、$y = 2x+1$),关键不在于“禁止重复绘图”,而在于统一坐标映射规则、避免绘图覆盖干扰,并结构化管理各函数的绘制逻辑。你原始代码中无法显示多图的根本原因有三点:

✅ 正确实现方式如下:
将坐标变换与绘图逻辑封装为可复用函数:
def plot_function(canvas, func, x_range, color="red", step=0.1, point_size=2):
"""
在 canvas 上绘制函数 func(x),支持多图叠加
:param canvas: Tkinter Canvas 实例
:param func: 可调用对象,如 lambda x: x**2
:param x_range: 元组 (x_min, x_max)
:param color: 线条/点颜色
:param step: x 轴采样步长(越小越平滑)
:param point_size: 点直径(像素),建议 1~3
"""
x_min, x_max = x_range
x = x_min
while x <= x_max:
try:
y = func(x)
# 【关键】Tkinter 坐标转换:数学坐标 → 屏幕坐标
# 每单位 = 10 像素,原点(0,0)映射到画布中心(200,200)
screen_x = 200 + x * 10
screen_y = 200 - y * 10 # y轴翻转(数学y向上,屏幕y向下)
# 绘制实心圆点(直径 point_size)
r = point_size / 2
canvas.create_oval(
screen_x - r, screen_y - r,
screen_x + r, screen_y + r,
fill=color, outline=color
)
except (ValueError, ZeroDivisionError, OverflowError):
pass # 忽略无效值(如 sqrt(-1)、1/0)
x += step# 创建画布(同原代码)
canw = Canvas(wind, width=400, height=400, bg="white")
canw.pack()
# 绘制网格(保持不变)
for i in range(41):
color = "#000" if i == 20 else "#4C8098"
canw.create_line(0, i*10, 400, i*10, fill=color, width=1 if i!=20 else 2)
canw.create_line(i*10, 0, i*10, 400, fill=color, width=1 if i!=20 else 2)
# ✅ 同时绘制多个函数(颜色区分 + 独立参数)
plot_function(canw, lambda x: x**2, (-5, 5), "red", step=0.05)
plot_function(canw, lambda x: math.sin(x), (-5, 5), "blue", step=0.02)
plot_function(canw, lambda x: 2*x + 1, (-5, 5), "green", step=0.1)
plot_function(canw, lambda x: math.log(abs(x)+0.1), (-4, 4), "purple", step=0.05) # 避免 log(0)
wind.mainloop()通过封装绘图逻辑、统一坐标变换、分离函数定义,你不仅能轻松绘制任意数量的函数图像,还能灵活调整样式、范围与精度——这才是真正可扩展的 Tkinter 数学绘图方案。