如何实时绘制3x+1问题运算序列的动态折线图
3x+1运算过程实时折线图实现方法
你原来的代码有两个明显问题:一是没有终止条件,数值降到1之后会反复在1→4→2→1里死循环,永远跑不完;二是只用print打印结果,没有存储每一步的运算序列,没法给折线图提供数据源。
用matplotlib的交互模式就能实现边运算边绘图的效果,不需要等所有计算跑完再出图,第一次运行前先执行pip install matplotlib安装依赖,完整可运行代码如下:
import matplotlib.pyplot as plt from random import randint # 生成1-100之间的随机起始值 current_num = randint(1, 100) step = 0 # 存储运算步数、对应数值的列表,作为折线图数据源 x_steps = [] y_values = [] # 开启matplotlib交互模式 plt.ion() # 创建画布和坐标轴 fig, ax = plt.subplots(figsize=(10, 6)) # 初始化折线对象 line, = ax.plot(x_steps, y_values, marker='o', markersize=3, color='#1f77b4') # 设置图表基础属性 ax.set_title('3x+1问题运算过程实时变化', fontsize=14) ax.set_xlabel('运算步数', fontsize=12) ax.set_ylabel('当前数值', fontsize=12) ax.grid(alpha=0.3) while True: # 将当前步结果存入数据源 x_steps.append(step) y_values.append(current_num) # 更新折线数据 line.set_xdata(x_steps) line.set_ydata(y_values) # 自动调整坐标轴范围适配新数据 ax.relim() ax.autoscale_view() # 刷新画布渲染新内容 fig.canvas.draw() fig.canvas.flush_events() # 控制刷新速度,数值越小刷新越快 plt.pause(0.3) # 运算到1即终止,避免死循环 if current_num == 1: break # 按照3x+1规则计算下一个值 if current_num % 2 == 0: current_num = int(current_num / 2) else: current_num = current_num * 3 + 1 step += 1 # 关闭交互模式,保留图像窗口 plt.ioff() plt.show()
关键逻辑说明
- 核心是调用
plt.ion()开启matplotlib的交互渲染模式,默认模式下程序会阻塞在绘图逻辑,必须等所有代码执行完才会显示图像,做不到实时刷新 - 每算完一个值就更新折线数据源,之后必须调用
relim()和autoscale_view()自动调整坐标轴范围,不然数值变大后折线会跑出画布可视区域 - 偶数运算时把结果转成整数,避免出现
2.0、1.0这类浮点数,数值展示更整洁 - 你可以根据需要调整
plt.pause()里的参数,数值越小折线刷新速度越快,设成0.1就能看到比较流畅的跳变效果
内容的提问来源于stack exchange,提问作者Reuban Ramsden
相关产品推荐
相关产品推荐

