如何消除Matplotlib极限演示程序中的初始红线?
问题解决:初始红线无法消失的修复方案
你的问题出在每次更新时只是新增绘制红线和红点,没有移除/更新旧的元素,初始的红线和红点会一直留在画布上。下面是修复后的完整代码,同时优化了绘图效率:
import matplotlib.pyplot as plt import numpy as np import keyboard def quadratic(x): return x ** 2 num = 150 def renum(k): return k / 10 # 目标点设置 tx = 150 ty = quadratic(tx) tslope = 2 * tx # 二次函数导数 # 初始化交互模式 plt.ion() plt.figure(figsize=(8, 6)) # 绘制二次函数曲线(保存对象方便后续更新) x = np.arange(0, 300, 0.001) y = quadratic(x) line, = plt.plot(x, y, color='black', label='y=x^2') plt.xlabel('x') plt.ylabel('y') plt.axhline(0, color='black', linewidth=0.5) plt.axvline(0, color='black', linewidth=0.5) # 初始化点A、点B及红线(保存对象,用于后续更新) pax = 0 pay = quadratic(pax) pbx = 300 pby = quadratic(pbx) red_line, = plt.plot([pax, pbx], [pay, pby], 'r-') red_dot_a, = plt.plot(pax, pay, 'ro', label=f'x={pax:.2f}') red_dot_b, = plt.plot(pbx, pby, 'ro', label=f'x={pbx:.2f}') # 绘制切线 tline = tslope * (x - tx) + ty plt.plot(x, tline, color='blue', label='Tangent at x=150') plt.legend() plt.draw() while True: plt.pause(0.1) if keyboard.is_pressed('a'): num = renum(num) plt.pause(0.1) # 更新x轴范围和二次函数曲线 x_new = np.arange(150 - 2 * num, 150 + 2 * num, 0.001) y_new = quadratic(x_new) line.set_data(x_new, y_new) # 更新点A、点B坐标 pax = 150 - 2 * num pay = quadratic(pax) pbx = 150 + 2 * num pby = quadratic(pbx) # 更新红线和红点的数据(替换旧元素,而非新增) red_line.set_data([pax, pbx], [pay, pby]) red_dot_a.set_data(pax, pay) red_dot_b.set_data(pbx, pby) # 更新红点的标签 red_dot_a.set_label(f'x={pax:.2f}') red_dot_b.set_label(f'x={pbx:.2f}') # 更新坐标轴范围 plt.xlim(min(x_new), max(x_new)) plt.ylim(min(y_new), max(y_new)) # 更新图例 plt.legend() plt.draw()
关键改动说明:
- 启用交互模式:添加
plt.ion(),确保matplotlib能实时更新画布内容 - 保存绘图对象:把初始的红线、红点、二次曲线都保存为变量(如
red_line, = plt.plot(...)),后续通过set_data()直接更新数据,而非重复绘制新元素 - 更新标签与图例:每次缩放后更新红点的标签,并重新生成图例,避免标签重复
- 避免重复绘制:所有动态变化的元素都通过更新已有对象实现,不会在画布上残留旧的图形
内容的提问来源于stack exchange,提问作者thankyouforyourkindness
相关产品推荐
相关产品推荐

