Python Matplotlib绘图问题:x/y变量未识别及步长方法实现
解决随机步长可视化的变量作用域问题&两种行走模式实现
看起来你遇到了变量作用域的核心问题——函数里没法识别外部的x、y,通常是因为你没把这些变量作为参数传入函数,或者错误地依赖了全局变量。我来一步步帮你解决这个问题,同时实现你要的两种随机行走模式。
一、先搞定「函数内识别不了x/y」的问题
假设你之前的代码是类似这样的常见错误写法:
import matplotlib.pyplot as plt import numpy as np x = [0] y = [0] def draw_walk(): # 这里直接用x、y会报错,函数默认找不到外部定义的变量 plt.plot(x, y) plt.show() draw_walk()
更规范的解决方式是通过参数传递变量(不推荐用global关键字,容易让代码逻辑混乱):
import matplotlib.pyplot as plt import numpy as np # 绘图函数:接收x、y路径作为参数 def draw_walk(x, y): plt.plot(x, y, alpha=0.5) # alpha设小一点,100条线不会挤成一团 # 生成第一种随机行走的函数:每次随机选全新角度 def generate_random_walk(steps=100): x = [0] y = [0] for _ in range(steps): angle = np.random.uniform(0, 2*np.pi) dx = np.cos(angle) dy = np.sin(angle) x.append(x[-1] + dx) y.append(y[-1] + dy) return x, y
这样调用时,每次生成的x、y路径都能正确传入绘图函数,不会再出现变量找不到的问题。
二、绘制100次随机步长结果
基于上面的函数,我们循环100次生成路径,统一绘制即可:
plt.figure(figsize=(8,8)) for _ in range(100): walk_x, walk_y = generate_random_walk(steps=200) # 可自定义行走步数 draw_walk(walk_x, walk_y) plt.title("100次随机角度行走路径") plt.xlabel("X坐标") plt.ylabel("Y坐标") plt.axis('equal') # 保证坐标轴比例一致,行走不会变形 plt.show()
三、实现第二种「朝向正态分布变化」的行走模式
这种模式的核心是:智能体不再每次随机选全新角度,而是在当前朝向的基础上,叠加一个正态分布的角度偏移。我们可以写一个专属的生成函数:
def generate_oriented_walk(steps=100, angle_std=np.pi/8): x = [0] y = [0] current_angle = np.random.uniform(0, 2*np.pi) # 初始随机朝向 for _ in range(steps): # 角度变化量服从均值0、标准差为angle_std的正态分布 angle_change = np.random.normal(0, angle_std) current_angle += angle_change # 可选:将角度限制在0~2π范围内(不处理也不影响坐标计算) current_angle = current_angle % (2*np.pi) dx = np.cos(current_angle) dy = np.sin(current_angle) x.append(x[-1] + dx) y.append(y[-1] + dy) return x, y
要绘制100次这种路径,只需要替换生成函数即可:
plt.figure(figsize=(8,8)) for _ in range(100): # 调整angle_std可以控制转向幅度,值越小行走越“笔直” walk_x, walk_y = generate_oriented_walk(steps=200, angle_std=np.pi/16) draw_walk(walk_x, walk_y) plt.title("100次朝向正态偏移行走路径") plt.xlabel("X坐标") plt.ylabel("Y坐标") plt.axis('equal') plt.show()
关键要点总结
- 函数内找不到外部变量?优先用参数传递,尽量避免全局变量
- 绘制多条路径时,用
alpha降低透明度,避免线条重叠看不清 - 第二种行走模式的核心是维护当前朝向角度,每次只做小幅度的正态偏移,而不是重新随机选角度
内容的提问来源于stack exchange,提问作者Alicia
相关产品推荐
相关产品推荐

