Python Matplotlib 基础的教程 (二) 随机漫步
随机漫步
首先我们导入choic
来生成随机方向
from random import choice
choice() 方法的语法:
random.choice( seq )
seq -- 可以是一个列表,元组或字符串。
例如:
choice([0, 1, 2, 3, 4])
返回值为上面列表的随机一个
### 漫步数据的生成
我们来生成随机漫步的点:
class RandomWalk(): def __init__(self, point=5000): """ 设置初始点坐标 并设置漫步次数 5000 """ self.point=point self.x=[0] self.y=[0] def fill_walk(self): # 不断循环直到达到漫步次数 while len(self.x) < self.point: """ 计算前进方向和步数 choice([1,-1]) 生成方向 choice([0, 1, 2, 3, 4]) 生成步数 相乘获得方向和距离 """ x_step = choice([1,-1]) * choice([0, 1, 2, 3, 4]) y_step = choice([1,-1]) * choice([0, 1, 2, 3, 4]) #拒绝原地踏步 if x_step == 0 and y_step == 0: continue next_x = self.x[-1] + x_step next_y = self.y[-1] + y_step #将漫步后的值添加到X,Y值的列表里 self.x.append(next_x) self.y.append(next_y)
大家应该还记得scatter()
参数的值是X,Y两个值的列表叭,
所以用append()
来将漫步后的值添加到X,Y的列表里
绘制
import matplotlib.pyplot as plt
rw = RandomWalk() #创建RW实例
rw.fill_walk() #生成X,Y值
plt.scatter(rw.x, rw.y, s=15)
plt.show()
绘点着色
还记得上一篇中的颜色映射吗?
在这里也是可以用的哦
我们将代码改成
plt.scatter(rw.x, rw.y, c=rw.point, cmap=plt.cm.Blues, s=15)
但是我们却收到了报错
ValueError: 'c' argument has 1 elements, which is inconsistent with 'x' and 'y' with size 5000.
大意就是 ValueError:'c'参数包含1个元素,与大小为5000的'x'和'y'不一致。
所以我们需要通过range()
来生成一个数字列表
pointList = list(range(rw.point))
plt.scatter(rw.x, rw.y, c=pointList, cmap=plt.cm.Blues, s=15)
调整尺寸
plt.figure(dpi=128, figsize=(10,6))
figsize()
设置的是窗口大小,单位嘛,是英尺
dpi
的值意思为像素/英尺
默认是80,即80像素/英尺
完整代码
使用类和函数
import matplotlib.pyplot as plt from random import choice class RandomWalk(): def __init__(self, point=5000): """ 设置初始点坐标 并设置漫步次数 """ self.point=point self.x=[0] self.y=[0] def fill_walk(self): # 不断循环直到达到漫步次数 while len(self.x) < self.point: """ 计算前进方向和步数 choice([1,-1]) 生成方向 choice([0, 1, 2, 3, 4]) 生成步数 相乘获得方向和距离 """ x_step = choice([1,-1]) * choice([0, 1, 2, 3, 4]) y_step = choice([1,-1]) * choice([0, 1, 2, 3, 4]) #拒绝原地踏步 if x_step == 0 and y_step == 0: continue next_x = self.x[-1] + x_step next_y = self.y[-1] + y_step #将漫步后的值添加到X,Y值的列表里 self.x.append(next_x) self.y.append(next_y) rw = RandomWalk() #创建RW实例 rw.fill_walk() #生成X,Y值 pointList = list(range(rw.point)) plt.figure(dpi=128, figsize=(10,6)) plt.scatter(rw.x, rw.y, c=pointList, cmap=plt.cm.Blues, s=15) plt.show()
不使用类和函数的简单版
注释请参考上面
import matplotlib.pyplot as plt from random import choice point=5000 #设置漫步次数 x = [0] y = [0] while len(x) < point: x_step = choice([1,-1]) * choice([0, 1, 2, 3, 4]) y_step = choice([1,-1]) * choice([0, 1, 2, 3, 4]) if x_step == 0 and y_step == 0: continue next_x = x[-1] + x_step next_y = y[-1] + y_step x.append(next_x) y.append(next_y) pointList = list(range(rw.point)) plt.figure(dpi=128, figsize=(10,6)) plt.scatter(x, y, c=pointList, cmap=plt.cm.Blues, s=15) plt.show()
彩蛋
1亿次随机漫步
Google colab宣告失败
goorm 宣告失败
1百万次随机漫步
Google colab花费34.408670s
goorm 花费1Min
由于endtime
写错位置了,不包括保存图片所消耗的时间
生成的图片高达15.09M
地址:
https://file.2002000.xyz/egg.png
Comments | NOTHING