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