欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 Python可视化绘制随机漫步

程序员文章站 2022-06-05 20:15:42
介绍如何将数据点绘制在图形上...

本文将通过调用模块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

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

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

荐
                                                        Python可视化绘制随机漫步
荐
                                                        Python可视化绘制随机漫步
同时也可以将骰子的点数做成散点图分布在图形上。

# -*- 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千次骰子的结果分布散点图。
荐
                                                        Python可视化绘制随机漫步
为了能清楚的看到,做一个两个骰子相乘的结果,这样有的线就是纯白色,这就是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])

荐
                                                        Python可视化绘制随机漫步
可以看到,线的明显程度和直方图统计的结果是相同的。
荐
                                                        Python可视化绘制随机漫步
你学废了吗?

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