使用matplotlib模拟花粉在水滴表面的运动轨迹
一、环境信息
python版本:2.7.13
matplotlib版本:2.1.0
matplotlib安装:pip install matplotlib 从python官方完整下载的最新的python版本自带pip
二、具体实现
我们需要明确一点的是,花粉在水滴中的运动是毫无规律的,上下左右都有可能,每次运动的距离也不可确定,但假设有个最大值和最小值(比如人走路的步伐大小,肯定有个最小值和最大值)
首先,我们需要实现移动的轨迹,简单的来说每移动一次都有一个x坐标和y坐标,这些坐标保存在两个列表中。具体代码如下:
pollen_movement.py
# -*- coding: utf-8 -*- """ 描述花粉在水中随机运动的轨迹 """ from random import choice class PollenMovement(): def __init__(self, number_points=5000): self.number_points = number_points #运动的次数 #默认花粉从坐标(0,0)开始运动 self.x_values = [0] #x方向的轨迹坐标,初始在原点 self.y_values = [0] #y方向的轨迹坐标,初始在原点 def move(self): while len(self.x_values) < self.number_points: x_direction = choice([1, -1]) #x轴运动方向,1为正方向,-1为反方向 x_distance = choice([0, 1, 2, 3, 4, 5, 6, 7, 8]) #x轴运动距离 x_step = x_direction * x_distance y_direction = choice([1, -1]) # y轴运动方向,1为正方向,-1为反方向 y_distance = choice([0, 1, 2, 3, 4, 5, 6, 7, 8]) # y轴运动距离 y_step = y_direction * y_distance #拒绝原地踏步 if x_step != 0 or y_step != 0: #计算下一个运动的轨迹点 next_x = self.x_values[-1] + x_step next_y = self.y_values[-1] + y_step self.x_values.append(next_x) self.y_values.append(next_y)
具体绘制移动轨迹的代码如下:
pollen_visual.py
# -*- coding: utf-8 -*- """ 绘制出花粉运动的轨迹图 """ import matplotlib.pyplot as plt from pollen_movement import PollenMovement while True: pm = PollenMovement(5000) pm.move() point_numbers = range(pm.number_points) #绘制花粉运动的轨迹图,且颜色由浅入深 plt.scatter(pm.x_values, pm.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=15) #将起点和终点高亮显示,s=100代表绘制的点的大小 plt.scatter(pm.x_values[0], pm.y_values[0], c='green', s=100) plt.scatter(pm.x_values[-1], pm.y_values[-1], c='red', s=100) # 隐藏x、y轴 plt.axes().get_xaxis().set_visible(False) plt.axes().get_yaxis().set_visible(False) #显示运动轨迹图 plt.show() keep_running = raw_input('是否继续运行?输入y,继续运行;输入n,终止运行:') if keep_running == 'n': break
具体实现效果图如下:
通过这种方法,也可以模拟一个人随机漫步的轨迹图,每次生成的图都不会一样,非常有意思