Python数据可视化---生成数据之随机漫步

首先,我们要使用Python来生成随机漫步数据,再使用matplotlib以引人瞩目的方式将这些数据呈现出来。

随机漫步是这样行走得到的路径:每次行走都完全是随机的,没有明确的方向,结果是由一系列随即决策决定的,吉祥蚂蚁在晕头转向的情况下每次都沿随机的方向前行说经过的路径。

实际用途:

自然界,物理学,生物学,化学和经济领域

例如:漂浮在水面上的划分因不断受到水分子的挤压而在水面上移动,水滴中分子的运动是随机的,因此花粉在水面上的运动路径犹如随机漫步。

创建RandomWalk()类

为模拟随机漫步,我们将创建一个名为RandomWalk的类,它将随机选择前进的方向。

这个类需要三个属性,其中一个是存储随机漫步次数的变量,其他两个是列表,分别存储随机漫步经过的每个点的xy坐标。

RandomWalk只包含两个方法,_init_()和fill_walk()

fill_walk()计算随机漫步经过的所有点:

from random import choice
#为做出随机决策,我们将所有可能的决策都存储在一个列表中,并在每次做出决策时都使用choice()来决定使用哪种选择
class RandomWalk():
#一个生成随机漫步数据的类
    def __init__(self,num_points=5000):
        #初始化随机漫步的属性
        #我们将随机漫步包含的点数设置为5000,这大到足以民生策划那个有趣的模式,同时又足够小,可确保能快速模拟随机漫步
        self.num_points=num_points
        #所有随机漫步都始于(0,0)
        self.x_value=[0]
        self.y_value=[0]
        #我们创建了两个列表,用来存储xy的值,并让每次漫步都从(0,0)点出发

选择方向

我们使用fill_walk()来生成漫步包含的点,并决定每次漫步的方向,:

def fill_walk(self):
        #计算随机漫步包含的所有点
        #不断漫步,直到列表达到指定长度
        while len(self.x_value)<self.num_points:
            #决定前进方向和沿着这个方向前进的距离
            #我们建立了一个循环,这个循环不断运行,直到漫步包含所需数量的点。
            #这个方法的主要部分告诉Python如何模拟四种漫步决定:向右向左向上向下以及沿着指定方向走多远
            x_direction=choice([1,-1])
            x_distance=choice([0,1,2,3,4])
            x_step=x_direction*x_distance
            #choice([1,-1])给x_direction选择一个值,结果要么是表示向右走的1,要么是表示向左走的-1
            #choice([0,1,2,3,4])给x_distance选择一个值,告诉Python沿着指定方向走多远,通过包含零,我们不仅能够沿着两个轴移动,还能沿着一个轴运动
            #移动方向乘以移动距离来确定沿着xy轴移动的距离
            #如果x_step>0,将向右移动,<0将向左移动,=0将垂直移动

            y_direction=choice([1,-1])
            y_distance=choice([0,1,2,3,4])
            y_step=y_direction*y_distance
            #如果y_step>0,将向上移动,<0将向下移动,=0将水平移动
            
            #当x_step=y_step=0时,意味着原地踏步,我们拒绝这样的情况,接着执行下一次的循环
            #拒绝原地踏步
            if x_step==0 and y_step==0:
                continue

            #为获取漫步中下一个点的x,y值,我们将x_step与x_value中的最后一个值相加,对y做同样的处理
            #计算下一个x,y的值
            next_x=self.x_value[-1]+x_step
            next_y=self.y_value[-1]+y_step

            #获得下一个点的x,y之后,我们将它们分别附加到列表x_value和y_value的末尾
            self.x_value.append(next_x)
            self.y_value.append(next_y)

绘制随机漫步图

我们首先导入了模块pyplot和RandomWalk类,然后创建了一个RandomWalk实例,并将其存储在rw中,再调用fill_walk(),

将随机漫步包含的xy传递给scatter(),并选择合适的尺寸点,

import matplotlib.pyplot as plt
from random import choice
rw=RandomWalk()
rw.fill_walk()
plt.scatter(rw.x_value,rw.y_value,s=15)
plt.show()

效果图:

模拟多次随机漫步

每次随机漫步都不同,因此探索可能生成的各种模式很有趣。

要在不多吃运行程序的情况下,使用前面的代码多次随机漫步,一种办法是将这些代码放在一个while循环中:

import matplotlib.pyplot as plt
from random import choice

while True:
    rw=RandomWalk()
    rw.fill_walk()
    plt.scatter(rw.x_value,rw.y_value,s=15)
    plt.show()

    keep_running=input("Make another walk? (y/n):")
    if keep_running=='n':
         break

这些代码模拟一次随机漫步,在matplotlib查看器中,在不关闭查看器的情况下暂停。

如果关闭查看器,程序将询问是否进行下一次的随机漫步。

这些随机漫步都在起点附近进行,大多沿着特定方向偏离起点,漫步点分布不均匀。

设置随机漫步图的样式

下面我们将定制图表,,以突出每次漫步的重要特征,,并让分散注意力的元素不那么明显。

为此,我们要确定要突出的元素,如漫步的起点,终点和经过的路径。

接下来要确定使其不那么显眼的元素,如刻度标记和标签。

最终的结果是简单的可视化表示,清楚地指出了每次漫步经过的路径。

给点着色

我们将使用颜色映射来指出漫步中先后各点的顺序

并删除每个点的黑色轮廓,让他们的颜色更加明显,

为根据漫步中各点的先后顺序进行着色,我们传递参数c,并将其设置成一个列表,其中包含各点的先后顺序。

由于这些点是按顺序绘制的,因此给参数c指定的列表只需包含数字1~5000

    rw=RandomWalk()
    rw.fill_walk()

    point_number=list(range(rw.num_points))
    plt.scatter(rw.x_value,rw.y_value,s=15,c=point_number,cmap=plt.cm.Blues,edgecolor='none')
    plt.show()

range()生成一个数字列表,其中包含的数字个数和漫步的点中的个数相等,

接下来我们将这个表存储在point_number中,

指定使用颜色Blues,并传递实参edgecolor=none以删除每个点周围的轮廓,

最终的随机漫步图从浅蓝色渐变为深蓝色

更多的学习请点击https://blog.csdn.net/guduruyu/article/details/60868501

效果图:

重新绘制起点终点

除了给随机漫步的各个点着色,以指出他们的先后顺序外,如果能呈现随机漫步的起点终点就好了。

为此,可在绘制随机漫步图后,重新绘制起点和终点

我么让起点和终点变得更大,并显示为不同的颜色,以突出它们:

    point_number=list(range(rw.num_points))
    plt.scatter(rw.x_value,rw.y_value,s=15,c=point_number,cmap=plt.cm.Blues,edgecolor='none')
    plt.scatter(0,0,c='green',edgecolors='none',s=100)
    plt.scatter(rw.x_value[-1],rw.y_value[-1],c='red',edgecolors='none',s=100)
    plt.show()

效果图:

为突出起点和终点,我使用绿色绘制起点,使用红色绘制终点,并调大尺寸。

隐藏坐标轴

突出随机漫步的路径

    point_number=list(range(rw.num_points))
    plt.scatter(rw.x_value,rw.y_value,s=15,c=point_number,cmap=plt.cm.Blues,edgecolor='none')
    plt.scatter(0,0,c='green',edgecolors='none',s=100)
    plt.scatter(rw.x_value[-1],rw.y_value[-1],c='red',edgecolors='none',s=100)
    plt.axes().get_xaxis().set_visible(False)
    plt.axes().get_yaxis().set_visible(False)
    plt.show()

效果图

为修改坐标轴,使用了函数plt.axes()来将每条坐标轴的可见性都设置为False。

增加点数

rw=RandomWalk(50000)

s=1

plt.scatter(rw.x_value,rw.y_value,s=1,c=point_number,cmap=plt.cm.Blues,edgecolor='none')

效果图

调整尺寸以适应屏幕

图表适合屏幕大小时,能够更好地将数据中的规律呈现出来,为了让绘图窗口更适合屏幕大大小,可以调整matplotlib输出的尺寸:

    plt.figure(figsize=(10,6))
    point_number=list(range(rw.num_points))
    plt.scatter(rw.x_value,rw.y_value,s=1,c=point_number,cmap=plt.cm.Blues,edgecolor='none')
    plt.scatter(0,0,c='green',edgecolors='none',s=100)
    plt.scatter(rw.x_value[-1],rw.y_value[-1],c='red',edgecolors='none',s=100)
    plt.axes().get_xaxis().set_visible(False)
    plt.axes().get_yaxis().set_visible(False)
    plt.show()

函数figure()用于指定图表的宽度和高度,分辨率以及背景色。

你需要给形参figsize指定一个元组,想matplotlib指出绘图窗口的尺寸,单位为英寸

Python假定屏幕分辨率为80像素(英寸),如果上述代码指定的图表尺寸不合适,课根据需要调整其中的数字。

如果你知道自己的系统的分辨率,课使用形参dpi向figure()传递分辨率,以有效地利用屏幕空间

plt.figure(dpi=128,figsize=(10,6))

效果图

无注释完整代码

from random import choice


class RandomWalk():
    def __init__(self,num_points=5000):
        self.num_points=num_points
        self.x_value=[0]
        self.y_value=[0]
    def fill_walk(self):
        while len(self.x_value)<self.num_points:
            x_direction=choice([1,-1])
            x_distance=choice([0,1,2,3,4])
            x_step=x_direction*x_distance

            y_direction=choice([1,-1])
            y_distance=choice([0,1,2,3,4])
            y_step=y_direction*y_distance

            if x_step==0 and y_step==0:
                continue

            next_x=self.x_value[-1]+x_step
            next_y=self.y_value[-1]+y_step

            self.x_value.append(next_x)
            self.y_value.append(next_y)


import matplotlib.pyplot as plt
from random import choice

while True:
    rw=RandomWalk(50000)
    rw.fill_walk()

    plt.figure(dpi=128,figsize=(10,6))
    point_number=list(range(rw.num_points))
    plt.scatter(rw.x_value,rw.y_value,s=1,c=point_number,cmap=plt.cm.Blues,edgecolor='none')
    plt.scatter(0,0,c='green',edgecolors='none',s=100)
    plt.scatter(rw.x_value[-1],rw.y_value[-1],c='red',edgecolors='none',s=100)
    plt.axes().get_xaxis().set_visible(False)
    plt.axes().get_yaxis().set_visible(False)
    plt.show()

    keep_running=input("Make another walk? (y/n):")
    if keep_running=='n':
         break

猜你喜欢

转载自blog.csdn.net/sdau_hangtt/article/details/81838653
今日推荐