数据可视化

发布于 2022-04-05  556 次阅读


生成数据

数据可视化指的是通过可视化表示来探索数据。它与数据分析密切相关,而数据分析指的是使用代码来探索数据集的规律和关联。数据集可以是用一行代码就能表示的小型数字列表,也可以是数千兆字节的数据。
漂亮的呈现数据并非仅仅关乎漂亮的图片。通过以引人注目的简单方式呈现数据,能让观看者明白其含义:发现数据集中原本未知的归来吧和意义。
Python的高效性,使用它在笔记本电脑上就能快速地探索由数百万个数据点组成的数据集,数据点并非必须是数,也可对非数值数据进行分析。
在基因研究,天气研究,政治经济分析等众多领域,人们常常使用Python来完成数据密集型工作。根据科学家使用Python编写了一系列优秀的可视化和分析工具。最流行的一款是Matplotlib,它是一个数学绘图库,使用它来制作简单的图表。如折线图和散点图,然后,基于随机漫步概念生成了一个更有趣的数据集————根据一系列随机决策生成的图标。
本章还使用Plotly包,它生成的图标非常适合在数字设备上显示。Plotly生成的图标可根据现实设备的尺寸自动调整大小,还具备众多交互性,如在用户将师表指向图标不同部分时突出数据集的特定方面。

前置安装及简单示例

需要库Matplotlib
官网:https://matplotlib.org/

绘制简单的折线图

import matplotlib.pyplot as plt

squares = [1,4,9,16,25]
fig,ax = plt.subplots()
ax.plot(squares)

plt.show()

创建了一个名为squares的列表,在其中存储要用来制作图标的数据。采用了一种常见的Matplotlib做法————调用subplots().这个函数可以在一张图片中绘制一个或多个图表。变量fig表示整张图片,变量ax表示图片中的各个图标,大多数情况下要使用它。
接下来调用方法plot(),它尝试根据给定的数据以有意义的方式绘制图表。函数plt.show()打开Matplotlib查看器并现实绘制的图标。
file

修改标签文字和线条粗细

Matplotlib能够调整可视化的各个方面。

import matplotlib.pyplot as plt
# 中文标签
from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"C://Windows/Fonts/STKAITI.TTF", size=15)

squares = [1,4,9,16,25]
fig,ax = plt.subplots()

ax.plot(squares,linewidth=3)

# 设置图表标题并给坐标轴上加上标签
ax.set_title("平方数",fontsize=24,fontproperties=font)
ax.set_xlabel("值",fontsize=14,fontproperties=font)
ax.set_ylabel("值的平方",fontsize=14,fontproperties=font)

# 设置刻度标记的大小
ax.tick_params(axis='both',labelsize=14)

plt.show()

linewidth决定了plot()绘制的线条粗细。方法set_title()给图标指定标题。方法set_xlabel()和set_ylabel()让你能够为每条轴设置标题。方法tick_params()设置刻度的样式。其中指定的实参将影响x轴和y轴上的刻度(axes='both'),并将刻度标记的字号设置为14。
file

矫正图像

折线图并没有按照我们所想绘制正确的图像。
向plot()提供一系列数时,它假设第一个数据点对应的x最表值为0,但这里的第一个点对应的x值为1.为改变这种默认行为,可向plot()同时提供输入值和输出值。

import matplotlib.pyplot as plt
# 中文标签
from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"C://Windows/Fonts/STKAITI.TTF", size=15)

input_values = [1,2,3,4,5]
squares = [1,4,9,16,25]

fig,ax = plt.subplots()
ax.plot(input_values,squares,linewidth=3)

# 设置图表标题并给坐标轴上加上标签
ax.set_title("平方数",fontsize=24,fontproperties=font)
ax.set_xlabel("值",fontsize=14,fontproperties=font)
ax.set_ylabel("值的平方",fontsize=14,fontproperties=font)

# 设置刻度标记的大小
ax.tick_params(axis='both',labelsize=14)

plt.show()

file
现在plot()正确绘制数据。因为同时提供了输入值和输出值,plot()无须对输出值的生成方式做出假设。最终图像是正确的。
使用plot()时可以指定各种实参,还可使用众多函数对图形进行定制。

使用内置样式

Matplotlib提供了很多已经定义好的样式,它们使用的背景色、网线格、线条粗细、字体、字号等设置很不错,让无需太多定制就可以生成引人瞩目的可视化效果。
要想获知当前系统中可以使用哪些样式,可以在终端中:

>>> import matplotlib.pyplot as plt

Backend TkAgg is interactive backend. Turning interactive mode on.
>>> plt.style.available
['Solarize_Light2', '_classic_test_patch', '_mpl-gallery', '_mpl-gallery-nogrid', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']

要使用这些样式,可在生成图标代码前面加:

...
plt.style.use('样式')
fix,ax...
...

例如:

import matplotlib.pyplot as plt
# 中文标签
from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"C://Windows/Fonts/STKAITI.TTF", size=15)

input_values = [1,2,3,4,5]
squares = [1,4,9,16,25]

plt.style.use('Solarize_Light2')
fig,ax = plt.subplots()
ax.plot(input_values,squares,linewidth=3)

# 设置图表标题并给坐标轴上加上标签
ax.set_title("平方数",fontsize=24,fontproperties=font)
ax.set_xlabel("值",fontsize=14,fontproperties=font)
ax.set_ylabel("值的平方",fontsize=14,fontproperties=font)

# 设置刻度标记的大小
ax.tick_params(axis='both',labelsize=14)

plt.show()

file

使用scatter()绘制散点图并设置样式

有时候,绘制散点图并设置各个数据点的样式很有用。例如,你可以想象一种颜色显示较小的值,而另一种颜色显示较大的值。绘制大型数据集时,还可以对每个点都设置同样的样式,再使用不同的样式选项重新绘制某些点以示突出。
要绘制单个点,可使用scatter(),向它传递一对一x坐标和y坐标,它将在指定位置绘制一个点:

import matplotlib.pyplot as plt
# 中文标签
from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"C://Windows/Fonts/STKAITI.TTF", size=15)

plt.style.use('seaborn')

fig,ax = plt.subplots()
ax.scatter(2,4,s=200)

# 设置图表标题并给坐标轴上加上标签
ax.set_title("平方数",fontsize=24,fontproperties=font)
ax.set_xlabel("值",fontsize=14,fontproperties=font)
ax.set_ylabel("值的平方",fontsize=14,fontproperties=font)

# 设置刻度标记的大小
ax.tick_params(axis='both',labelsize=14)

plt.show()

file
调用scatter()并且使用参数s设置绘制图形时使用的点的尺寸。

使用scatter()绘制一系列点

要绘制一系列点,可向scatter()传递两个分别包含x值和y值的列表。

import matplotlib.pyplot as plt
# 中文标签
from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"C://Windows/Fonts/STKAITI.TTF", size=15)

plt.style.use('seaborn')

x_values = [1,2,3,4,5]
y_values = [1,4,9,16,25]

fig,ax = plt.subplots()
ax.scatter(x_values,y_values,s=100)

# 设置图表标题并给坐标轴上加上标签
ax.set_title("平方数",fontsize=24,fontproperties=font)
ax.set_xlabel("值",fontsize=14,fontproperties=font)
ax.set_ylabel("值的平方",fontsize=14,fontproperties=font)

# 设置刻度标记的大小
ax.tick_params(axis='both',labelsize=14)

plt.show()

file

自动计算数据

手工计算列表要包含的值可能效率低下,需要绘制的点很多时更是如此。不必手工计算包含点坐标的列表,可以使用Python循环来完成。
下面绘制1000个点:

import matplotlib.pyplot as plt
# 中文标签
from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"C://Windows/Fonts/STKAITI.TTF", size=15)

plt.style.use('seaborn')

x_values = range(1,1001)
y_values = [x**2 for x in x_values]

fig,ax = plt.subplots()
ax.scatter(x_values,y_values,s=10)

# 设置图表标题并给坐标轴上加上标签
ax.set_title("平方数",fontsize=24,fontproperties=font)
ax.set_xlabel("值",fontsize=14,fontproperties=font)
ax.set_ylabel("值的平方",fontsize=14,fontproperties=font)

# 设置刻度标记的大小
ax.tick_params(axis='both',labelsize=14)

# 设置每个坐标轴的取值范围
ax.axis([0,1100,0,1100000])

plt.show()

file
首先创建了一个包含x值的列表,其中包含1~1000.接下来,是一个生成y值的列表解析。遍历x值,计算x平方,将其存储到y_values中。
使用axis()指定了每个坐标轴的取值范围。axis()要求提供4个值。x和y坐标的最小值和最大值。

自定义颜色

要修改数据点颜色,可向scatter()传递参数c,并将其设置为要使用的颜色的名称(放在引号内):

ax.scatter(x_values,y_values,c='red',s=10)

还可以使用RGB颜色模式自定义颜色。要指定自定义颜色,可传递参数c,并将其设置为一个元组,其中包含三个0~1的小数值。

ax.scatter(x_values,y_values,c=(0,0.8,0),s=10)

值越接近0,指定的颜色越深;值越接近1,指定的颜色越浅。

使用颜色映射

颜色映射是一系列颜色,从起始颜色渐变到结束颜色。在可视化中,颜色映射突出了数据的规律。例如:用较浅的颜色来显示较小的值,并使用较深的颜色来显示较大的值。
模块pyplot内置了一组颜色映射。要使用这些颜色映射,需要告诉pyplot该如何设置数据集中每个点的颜色。下面演示了如何根据每个点的y值来设置其颜色。

import matplotlib.pyplot as plt
# 中文标签
from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"C://Windows/Fonts/STKAITI.TTF", size=15)

plt.style.use('seaborn')

x_values = range(1,1001)
y_values = [x**2 for x in x_values]

fig,ax = plt.subplots()
ax.scatter(x_values,y_values,s=10,c=y_values,cmap=plt.cm.Blues)

# 设置图表标题并给坐标轴上加上标签
ax.set_title("平方数",fontsize=24,fontproperties=font)
ax.set_xlabel("值",fontsize=14,fontproperties=font)
ax.set_ylabel("值的平方",fontsize=14,fontproperties=font)

# 设置刻度标记的大小
ax.tick_params(axis='both',labelsize=14)

# 设置每个坐标轴的取值范围
ax.axis([0,1100,0,1100000])

plt.show()

file
将参数c设置成为了一个y值列表。并使用参使cmap告诉pyplot使用哪个颜色映射,这些代码将y值较小的点显示为浅蓝色,并将y值较大的点显示为深蓝色。

注意:要了解pyplot中所有的颜色映射,访问Matplotlib网站主页,点击Examoles,找到color,单击Colormap reference

自动保存图标

要让程序自动将图表保存到文件中。使用plt.savefig():

plt.savefig('xxx.png',bbox_inches='tight')

第一个实参指定要以什么文件名保存图表,这个文件将存储到scatter_squares.py所在的牡蛎。
第二个实参指定将图标多余的空白区域裁剪掉。如果要保留,删除第二个实参即可。

随机漫步

使用Python生成随机漫步数据,再使用Matplotlib以引人注目的方式将这些数据展现出来。
随机漫步是这样行走得到的路径:每次行走都是完全随机的、没有明确方向,结果是由一系列随机决策决定的。

创建RandomWalk类

为了模拟随机漫步,将创建一个名为RandomWalk的类,它随机地访问选择前进方向,这个类需要三个属性:一个是存储随机漫步次数的变量,其他两个是列表,分别存储随机漫步经过的每个点的x坐标和y坐标。
RandomWalk类只包含两个方法:方法__init__()和fill_walk().后者计算随机漫步经过的所有点
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]

为做出随机决策,将所有可能的选择都存储在一个列表中,并且在每次决策时候都使用模块random中的choice()来决定使用哪种选择。接下来,将随机漫步包含的默认点数设置为5000,这个数大到足以生成有趣的模式。又小到可确保能够快速地模拟随机漫步。然后,创建两个用于存储x值和y值的列表,并让每次漫步都从(0,0)出发。

选择方向

使用方法fill_walk()来生成漫步包含的点并决定每次漫步的方向。如下所示。

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]

    def fill_walk(self):
        """计算随机漫步包含的所有点。"""

        # 不断漫步,直到列表表达到指定长度。
        while len(self.x_values) < 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

            # 计算下一个点的x值和y值
            x = self.x_values[-1] + x_step
            y = self.y_values[-1] + y_step

            self.x_values.append(x)
            self.y_values.append(y)

方法fill_walk()的主要部分告诉Python如何模拟四种漫步决定:左右上下走多远?
使用choice([1,-1])给x_values一个选择,左-1右-1.choice([0,1,2,3,4])表示多少步。通过包含0,不仅仅只能同时延两个轴移动,还能够沿着一个轴移动。
x_step和y_step表示左右和上下移动。
为了获取漫步中下一个点的x值,将x_step和x_values中的最后一个值相加,对y值也做相同的处理。获取到后,将它们分别附加到列表x_values 和y_values的末尾。

绘制随机漫步图

import matplotlib.pyplot as plt

from random_walk import RandomWalk

# 创建一个RandomWalk实例
rw = RandomWalk()
rw.fill_walk()
# 将所有的点都绘制出来
plt.style.use('classic')
fig,ax = plt.subplots()
ax.scatter(rw.x_values,rw.y_values,s=15)
plt.show()

file

模拟多次随机漫步

每次随机漫步都不同,因此探索可能生成的各种模式很有趣,要在不多次允许程序情况下使用前面的代码模拟多次随机漫步,一种办法是将这些代码放入一个while循环中:

import matplotlib.pyplot as plt

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断地模拟随机漫步。
while True:
    # 创建一个RandomWalk实例
    rw = RandomWalk()
    rw.fill_walk()

    # 将所有的点都绘制出来
    plt.style.use('classic')
    fig, ax = plt.subplots()
    ax.scatter(rw.x_values, rw.y_values, s=15)
    plt.show()

    keep_running = input("Make another walk?(Y/N):")
    if keep_running == 'N':
        break

设置随机漫步图的样式

特定制图表。以突出每次漫步的重要特征,并让分散注意力的元素不那么显眼,为此,我们确定要突出的元素,如漫步的起点,重点和经过的路径。接下来确定要使其不那么明显的元素,如刻度标记和标签。最终的结果是简单的可视化表示,清楚的指出了每次漫步经过的路径。

1.给点着色

使用颜色映射来指出漫步中个点的现后顺序,并删除每个点的黑色轮廓,让其颜色更为明显。
为了根据漫步中各点的现后顺序来着色,传递参数c,并将其设置为一个列表,其中包含个点的现后顺序,这些点是按顺序绘制的,因此给参数c指定的列表只需包含0~4999。

import matplotlib.pyplot as plt

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断地模拟随机漫步。
while True:
    # 创建一个RandomWalk实例
    rw = RandomWalk()
    rw.fill_walk()

    # 将所有的点都绘制出来
    plt.style.use('classic')
    fig, ax = plt.subplots()
    point_numers = range(rw.num_points)
    ax.scatter(rw.x_values, rw.y_values, c=point_numers,cmap=plt.cm.Blues,edgecolors='none', s=15)
    plt.show()

    keep_running = input("Make another walk?(Y/N):")
    if keep_running == 'N':
        break

file

重新绘制起点和终点

除了给随机漫步的各个点着色,以指出其现后顺序外,如果还能能呈现随机漫步的起点和终点就好了。为此,可以在绘制随机漫步图后重新绘制起点和终点。

import matplotlib.pyplot as plt

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断地模拟随机漫步。
while True:
    # 创建一个RandomWalk实例
    rw = RandomWalk()
    rw.fill_walk()

    # 将所有的点都绘制出来
    plt.style.use('classic')
    fig, ax = plt.subplots()
    point_numers = range(rw.num_points)
    ax.scatter(rw.x_values, rw.y_values, c=point_numers,cmap=plt.cm.Blues,edgecolors='none', s=15)

    # 突出起点和终点
    ax.scatter(0,0,c='green',edgecolors='none',s=100)
    ax.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)
    plt.show()

    keep_running = input("Make another walk?(Y/N):")
    if keep_running == 'N':
        break

file

3.隐藏坐标轴

隐藏坐标轴

import matplotlib.pyplot as plt

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断地模拟随机漫步。
while True:
    # 创建一个RandomWalk实例
    rw = RandomWalk()
    rw.fill_walk()

    # 将所有的点都绘制出来
    plt.style.use('classic')
    fig, ax = plt.subplots()
    point_numers = range(rw.num_points)
    ax.scatter(rw.x_values, rw.y_values, c=point_numers,cmap=plt.cm.Blues,edgecolors='none', s=15)

    # 突出起点和终点
    ax.scatter(0,0,c='green',edgecolors='none',s=100)
    ax.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)

    # 隐藏坐标轴
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)

    plt.show()

    keep_running = input("Make another walk?(Y/N):")
    if keep_running == 'N':
        break

file
方法ax.get_xaxis()和ax.get_yaxis()将每条坐标轴的可见性都设置为False。

4.增加点数

下面来增加点数,以提供更多数据。

import matplotlib.pyplot as plt

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断地模拟随机漫步。
while True:
    # 创建一个RandomWalk实例
    rw = RandomWalk(50_000)
    rw.fill_walk()

    # 将所有的点都绘制出来
    plt.style.use('classic')
    fig, ax = plt.subplots()
    point_numers = range(rw.num_points)
    ax.scatter(rw.x_values, rw.y_values, c=point_numers,cmap=plt.cm.Blues,edgecolors='none', s=1)

    # 突出起点和终点
    ax.scatter(0,0,c='green',edgecolors='none',s=100)
    ax.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)

    # 隐藏坐标轴
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)

    plt.show()

    keep_running = input("Make another walk?(Y/N):")
    if keep_running == 'N':
        break

file

5.调整尺寸以适应屏幕

图表适合屏幕大小时,更能有效的将数据中规律呈现出来,为了让绘图更适合屏幕大小:

...
fig, ax = plt.subplots(figsize=(15,9))
...

file
创建图标时可以传递参数figsize以指定生成的图形的尺寸。需要给figsize指定一个元组,向Matplolib指出绘图窗口的尺寸,单位为英寸(1英寸 = 2.54cm)
也可通过dpi向plt.sublots()传递该分辨率。

fig, ax = plt.subplots(figsize=(10,6),dpi =128)

使用Plotly模拟掷骰子

使用Python包Plotly来生成交互式表格。需要创建在浏览器中显式的图表时,Plotly很有用,因为它生成的图表将自动缩放以适合观看者的屏幕。Plotly生成的图表还是交互式的:用户将鼠标指向特定元素时,将突出显示该元素的信息。

安装Plotly

pip install plotly

官网:https://community.plotly.com/

创建Die类

为了模拟一个骰子的情况:

from random import randint

class Die:
    """表示一个骰子的类"""

    def __init__(self,num_sides=6):
        """骰子默认为6面"""
        self.num_sides = num_sides

    def roll(self):
        """返回一个位于1和骰子面数之间的随机数。"""
        return randint(1,self.num_sides)

骰子是根据面数命名的,6面骰子名为D6,8面骰子名为D8.
方法roll()使用函数randint()来返回一个1和面数之间的随机数。这个函数可能返回1和num_sides或这两个值之间的任何整数。

投骰子

from die import Die

# 创建一个D6
die = Die()

# 掷几次骰子并将结果存储在一个列表中
results = []
for roll_num in range(100):
    result = die.roll()
    results.append(result)

print(results)

file

分析结果

为分析掷一个D6的结果,计算每个点数出现的次数:

from die import Die

# 创建一个D6
die = Die()

# 掷几次骰子并将结果存储在一个列表中
results = []
for roll_num in range(1000):
    result = die.roll()
    results.append(result)

# 分析结果
frequencies = []
for value in range(1,die.num_sides+1):
    frequency = results.count(value)
    frequencies.append(frequency)

print(frequencies)

file
使用Plotly来分析,而不是将结果打印出来,因此可将模拟掷骰子的次数增加到1000.将每个点数出现的次数存入列表中。
遍历可能的点数,计算每种点数在result中出现了多少次。并将结果附加入列表中。

绘制直方图

有了频率列表,就可以绘制直方图了。

from plotly.graph_objs import Bar,Layout
from plotly import offline

from die import Die

# 创建一个D6
die = Die()

# 掷几次骰子并将结果存储在一个列表中
results = []
for roll_num in range(1000):
    result = die.roll()
    results.append(result)

# 分析结果
frequencies = []
for value in range(1,die.num_sides+1):
    frequency = results.count(value)
    frequencies.append(frequency)

# 对结果进行可视化
x_values = list(range(1,die.num_sides+1))
data = [Bar(x=x_values,y=frequencies)]

x_axis_config = {'title':'结果'}
y_axis_config = {'title':'结果的频率'}
my_layout = Layout(title='投一个D6 1000次的结果',xaxis=x_axis_config,yaxis=y_axis_config)
offline.plot({'data':data,'layout':my_layout},filename='d6.html')

file
为了创建直方图,需要为每个可能出现的点数生成一个条形。将可能出现的点数存入x_values列表内。Plotly不能直接接受range()的结果,因此需要用list()将其转换为列表。Plotly类Bar()表示用于绘制条行图的数据集。需要一个存储x值的列表和一个存储y值的列表。这个类必须在方括号内,因为数据集可能包含多个元素。
每个坐标轴都能以不同的方式进行配置,而每配置选项都是一个字典元素。这里只设置了坐标轴标签,类Layout()返回一个指定图标布局和配置的对象。这里设置了图表名称,并传入了x轴和y轴的配置字典。
为生成图表。调用了函数offline.plot()。这个函数需要一个包含数据和布局对象的字典,还接受一个文件命,指定要将图标保存到哪里。
Plotly让这个图标具有交互性。

同时投掷两个骰子

from plotly.graph_objs import Bar,Layout
from plotly import offline

from die import Die

# 创建两个个D6
die1 = Die()
die2 = Die()

# 掷几次骰子并将结果存储在一个列表中
results = []
for roll_num in range(1000):
    result = die1.roll() + die2.roll()
    results.append(result)

# 分析结果
frequencies = []
max_result = die1.num_sides + die2.num_sides
for value in range(2,max_result+1):
    frequency = results.count(value)
    frequencies.append(frequency)

# 对结果进行可视化
x_values = list(range(2,max_result+1))
data = [Bar(x=x_values,y=frequencies)]

x_axis_config = {'title':'结果','dtick':1}
y_axis_config = {'title':'结果的频率'}

my_layout = Layout(title='投两个D6 1000次的结果',xaxis=x_axis_config,yaxis=y_axis_config)
offline.plot({'data':data,'layout':my_layout},filename='d6_d6.html')

file
创建图表时,在字典x_axis_config中使用了dtick键。这项设置指定了x轴显示的刻度间距。这里绘制的直方图包含的条行更多,Plotly默认只显示某些刻度值,而设置'dtick':1让Plotly显示每个刻度值。

同时掷两个面数不同的骰子

下面创建一个6面和10面的骰子。

from plotly.graph_objs import Bar,Layout
from plotly import offline

from die import Die

# 创建一个D6和一个D10
die1 = Die()
die2 = Die(10)

# 掷几次骰子并将结果存储在一个列表中
results = []
for roll_num in range(50_000):
    result = die1.roll() + die2.roll()
    results.append(result)

# 分析结果
frequencies = []
max_result = die1.num_sides + die2.num_sides
for value in range(2,max_result+1):
    frequency = results.count(value)
    frequencies.append(frequency)

# 对结果进行可视化
x_values = list(range(2,max_result+1))
data = [Bar(x=x_values,y=frequencies)]

x_axis_config = {'title':'结果','dtick':1}
y_axis_config = {'title':'结果的频率'}

my_layout = Layout(title='投一个D6和一个D10 50 000次的结果',xaxis=x_axis_config,yaxis=y_axis_config)
offline.plot({'data':data,'layout':my_layout},filename='d6_d10.html')

file

小结

如何生成数据集以及如何对其进行可视化;如何使用Matplotlib创建简单的图表。如何使用散点图来探索随机漫步;使用Plotly来创建直方图。


擦肩而过的概率