当前位置: 移动技术网 > IT编程>脚本编程>Python > 荐 Python可视化绘制随机漫步

荐 Python可视化绘制随机漫步

2020年07月16日  | 移动技术网IT编程  | 我要评论

本文将通过调用模块matplotlib.pyplot,实现随机漫步案例。
来学习如何绘制坐标点。python可视化是我们进行数据分析的良好工具。

文章将通过一个初始点从0.0开始,随机的移动,漫步,生成的结果显示再图上进行展示。
需要创建一个进行随机漫步的类,方向和移动举例都可以通过正负进行表示。

# -*- coding: utf-8 -*-
"""
Created on Sat Jul 11 10:33:08 2020

@author: xuhaobo
"""
from random import choice

class RandomWalk():
    #生成随机漫步的类
    def __init__(self,num_points = 5000):
        #初始化漫步的属性
        self.num_points = num_points
        
        #漫步起始于(0,0)
        self.x_values = [0]
        self.y_values = [0]
        self.x_value = []
        self.y_value = []
       
        #重构后将移动距离函数分离
    def get_step(self):
        direction = choice([-1,1])
        distance = choice([0,1,2,3,4])
        step = direction*distance
        return step
        
    def fill_walk(self):
        #不断漫步,直到到达指定长度
        while (len(self.x_values)) < self.num_points:
            #前进方向和距离
            x_step = self.get_step()#调用距离计算函数
            y_step = self.get_step()
            
            #不可原地踏步
            if x_step == 0 and y_step == 0:
                continue
            
            #计算下一个点的值
            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)
            
#            #方便可视化而创建
#            self.x_value.append(x_step)
#            self.y_value.append(y_step)

随后对移动的点进行显示,

# -*- coding: utf-8 -*-
"""
Created on Sat Jul 11 10:51:57 2020

@author: xuhaobo
"""
import matplotlib.pyplot as plt
from random_walk import RandomWalk #导入之前写的漫步类
while True:   
    rw = RandomWalk()#默认点数为5000,可以传参修改
    rw.fill_walk() #类的方法
    
    #设置窗口大小,通过指定figsize元组进行控制
#    plt.figure(dpi=128,figsize=(8,6))
    #使用plot画坐标轴
#    plt.plot(rw.x_values,rw.y_values,linewidth=5)
    
#画点    
    point_numbers = list(range(rw.num_points))
    plt.scatter(rw.x_values,rw.y_values,c =point_numbers,cmap=plt.cm.Blues,edgecolors="none",s = 15)
#    plt.scatter(rw.x_values,rw.y_values,c = point_numbers,s = 15)#漫天飞舞
    
    #突出起点和终点
    plt.scatter(0,0,c = "red",s = 200)
    plt.scatter(rw.x_values[-1],rw.y_values[-1],c = "green",s = 200)
    
    #隐藏坐标轴
    plt.axes().get_xaxis().set_visible(False)
    plt.axes().get_yaxis().set_visible(False)
    
    plt.show()
    
    chioce = input("是否继续--y/n:")#不断的重新绘制漫步情况
    if chioce == "n" or chioce == "N":
        break

结果如下:
在这里插入图片描述
在这里插入图片描述
生成起点都是随机的,从0.0开始,因为隐藏了坐标轴,看不太出来,下面展示未隐藏坐标轴的结果。
在这里插入图片描述
在这里插入图片描述
可以看到无论如何起点都是0.0,当然你也可以通过控制坐标轴的范围使起点固定,但是可能会导致有的点无法显示。上面的点全部设置的都是蓝色,随着距离的深浅变化的。
下面展示根据参数值进行的颜色。
在这里插入图片描述
在这里插入图片描述
感觉有点像霞,我叫它漫天飞羽。

plt.scatter(rw.x_values,rw.y_values,c = point_numbers,s = 15)#漫天飞舞

对于上一篇文章提到的直方图统计的绘制,这里也可以将每次移动的距离进行统计。
将两种方式结合,下面将移动的距离在x轴方向和y轴方向上做一个直方图统计。

 # -*- coding: utf-8 -*-
import pygal
import matplotlib.pyplot as plt
from random_walk import RandomWalk
while True:   
    rw = RandomWalk(5000)#默认点数为5000,可以传参修改
    rw.fill_walk()
    
    #将生成的活动点的坐标进行可视化处理
    #统计范围
    x_results = [i for i in range(min(rw.x_value),max(rw.x_value)+1)]
    y_results = [i for i in range(min(rw.y_value),max(rw.y_value)+1)]
    
    #统计出现次数
    x_frequencies = [rw.x_value.count(i) for i in range(min(rw.x_value),max(rw.x_value)+1)]
    y_frequencies = [rw.y_value.count(i) for i in range(min(rw.y_value),max(rw.y_value)+1)]
    
    
    hist1 = pygal.Bar()
    hist1.title = "统计移动5000次的x的变化结果"
    hist1.x_labels=[i for i in x_results] 
    hist1.x_title = "移动值"
    hist1.y_title = "移动值对应的次数"    
    hist1.add("x",x_frequencies)
    hist1.render_to_file('die_visual_x.svg')
    
    hist2 = pygal.Bar()
    hist2.title = "统计移动5000次的y的变化结果"
    hist2.x_labels=[i for i in y_results] 
    hist2.x_title = "移动值"
    hist2.y_title = "移动值对应的次数"    
    hist2.add("y",y_frequencies)
    hist2.render_to_file('die_visual_y.svg')
    #设置窗口大小,通过指定figsize元组进行控制
#    plt.figure(dpi=128,figsize=(8,6))
    #使用plot画坐标轴
#    plt.plot(rw.x_values,rw.y_values,linewidth=5)
    
#画点    
    point_numbers = list(range(rw.num_points))
    plt.scatter(rw.x_values,rw.y_values,c = point_numbers,cmap=plt.cm.Blues,edgecolors="none",s = 15)
#    plt.scatter(rw.x_values,rw.y_values,c = point_numbers,s = 15)#漫天飞舞
    
    #突出起点和终点
    plt.scatter(0,0,c = "red",s = 200)
    plt.scatter(rw.x_values[-1],rw.y_values[-1],c = "green",s = 200)
    
    #隐藏坐标轴
    plt.axes().get_xaxis().set_visible(False)
    plt.axes().get_yaxis().set_visible(False)
    
    plt.show()
    
    chioce = input("是否继续--y/n:")
    if chioce == "n" or chioce == "N":
        break

在这里插入图片描述
在这里插入图片描述
同时也可以将骰子的点数做成散点图分布在图形上。

# -*- coding: utf-8 -*-
from die import Die
import matplotlib.pyplot as plt
die = Die()

results = [die.roll() for i in range(1,5001)]
results_x = [i for i in range(1,5001)]

plt.scatter(results_x,results,s = 1)
plt.title("scatter_squares",fontsize = 20)
plt.xlabel("x",fontsize = 20)
plt.ylabel("y",fontsize = 20)
plt.axis([0,6000,0,7])

图片不大能看出是散点图,但也能看出是5千次骰子的结果分布散点图。
在这里插入图片描述
为了能清楚的看到,做一个两个骰子相乘的结果,这样有的线就是纯白色,这就是5000次两个6面骰子成绩的统计图。

# -*- coding: utf-8 -*-
from die import Die
import matplotlib.pyplot as plt
die1 = Die()
die2 = Die()

results = [die1.roll()*die2.roll() for i in range(1,5001)]
results_x = [i for i in range(1,5001)]

plt.scatter(results_x,results,s = 1)
plt.title("scatter_squares",fontsize = 20)
plt.xlabel("x",fontsize = 20)
plt.ylabel("y",fontsize = 20)
plt.axis([0,6000,0,37])

在这里插入图片描述
可以看到,线的明显程度和直方图统计的结果是相同的。
在这里插入图片描述
你学废了吗?

本文地址:https://blog.csdn.net/qq_42707739/article/details/107347697

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网