从这章开始,我决定进一步缩小抄书的工作,因为我多少有点强迫症。前面沉没成本扔进去了,后面不抄就感觉哪里不舒服。

但是抄书很显然带来了一些额外的工作量,甚至有时候代码还没搞懂什么意思,书一定要抄完。这种买椟还珠的事情还是少做比较好。所以我决定进一步减少这部分的工作,加快工作效率。

顺便吐槽一下,在每一个项目前面有个二维码,写着“视频讲解”四个字,你注册图灵账号,再通过手机登陆后发现这个视频里的内容就四个字:敬请期待。

坑爹呢这是!不过好在有B站的视频可以做参考。

最头痛的地方就是第二版内容和B站视频的第一版内容不一样的地方。在外星人入侵的部分,我被这个问题折磨的快崩了。不过听说数据可视化的部分基本没什么太大差别。希望能好点吧。

不管了,我们进入本书的第二个项目:数据可视化吧。

15章 生成数据
目前最流行的数据可视化和分析工具之一是Matplotlib。

本章还将使用Plotly包,方便生成的图标再数字设备上显示。

本章内容是使用Plotly来分析掷骰子的结果。
15.1 安装Matplotlib
如果是python的,输入以下代码:
$ python -m pip install --user matplotib

如果是python3的话,输入以下代码:
$ python3 -m pip install --user matplotib

如果是mac的话,删除上面代码中的--user。

如果是pycharm的话,直接在项目下方的终端输入:pip install --user matplotib 即可。
15.2 绘制简单的折线图

下面绘制简单的折线图,再对其进行定制。

import matplotlib.pyplot as plt

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

plt.show()

首先导入模块pyplot,并指定别名plt。创建名为squares的列表,存储要用来制作图标的数据。然后哦,采取了matplotlib的做法——调用函数subolots()。这个函数可在一张图片中绘制一个或多个图标。变量fig表示整张图片。变量ax表示图片中的各个图表。

接下来调用方法plot(),它尝试根据给定的数据以有意义的方式绘制图标。函数plt.show()打开matplotlib查看器并显示绘制的图表。
15.2.1 修改标签文字和线条粗细
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']

squares = [1,4,9,16,25]

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

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

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

plt.show()
这里需要注意一下,Mac下的pycharm运行matplotlib的时候,输出的中文可能是乱码。网上有教程告诉我们怎么解决,地址如下:
https://blog.csdn.net/qq_32590631/article/details/80509741
15.2.2 校正图形
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']

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)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

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

plt.show()
15.2.3 使用内置样式
import matplotlib.pyplot as plt

asr =plt.style.available

print(asr)




plt.style.use('ggplot')
fig,ax = plt.subplots()
ax.plot(input_values,squares, linewidth=3)
15.2.4 使用scatter()绘制散点图并设置样式
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

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

plt.show()



import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

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

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

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

plt.show()

英文翻译:

axis = 轴

both = 两者都

which = 哪一个

major = 主要

label = 标签

tick_params = 勾选参数

15.2.5 使用scatter()绘制一系列点
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

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)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

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

plt.show()
15.2.6 自动计算数据
下面绘制1000个点的代码:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

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)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

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


plt.show()
15.2.7 自定义颜色
要修改数据点的颜色,可像scatter()传递参数c。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

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

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

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

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


plt.show()
15.2.8 使用颜色映射
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

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

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

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

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


plt.show()
15.2.9 自动保存图表
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

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

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

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

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


plt.savefig('15.2.4.png',bbox_inches='tight')
15.3 随机漫步
创建randomwalk类:
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]
15.3.2 选择方向
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.x_values[-1] + y_step
            
            self.x_values.append(x)
            self.y_values.append(y)
15.3.3 绘制随机漫步图
import matplotlib.pyplot as plt
from randomwalk import RandomWalk

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

# 创建一个RandomWalk 实例。
rw = RandomWalk()
rw.fill_walk()
# 将所有的点都绘制出来
fig,ax = plt.subplots()
ax.scatter(rw.x_values,rw.y_values,c='black',s=15)
plt.show()
15.3.4 模拟多次随机漫步
import matplotlib.pyplot as plt
from randomwalk import RandomWalk

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

# 只要程序处于活动状态,就不断地模拟随机漫步
while True:
# 创建一个RandomWalk 实例。
    rw = RandomWalk()
    rw.fill_walk()
    # 将所有的点都绘制出来
    fig,ax = plt.subplots()
    ax.scatter(rw.x_values,rw.y_values,c='black',s=15)
    plt.show()

    keep_running = input("是否继续?(是或否)")
    if keep_running == '否':
        break
15.3.5 设置随机漫步图的样式

1.给点着色
import matplotlib.pyplot as plt
from randomwalk import RandomWalk

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

# 只要程序处于活动状态,就不断地模拟随机漫步
while True:
# 创建一个RandomWalk 实例。
    rw = RandomWalk()
    rw.fill_walk()
    # 将所有的点都绘制出来
    fig,ax = plt.subplots()
    point_numbers = range(rw.num_points)
    ax.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,edgecolors='none',s=15)
    plt.show()

    keep_running = input("是否继续?(y或n)")
    if keep_running == 'n':
        break

2. 重新绘制起点和重点
import matplotlib.pyplot as plt
from randomwalk import RandomWalk

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

# 只要程序处于活动状态,就不断地模拟随机漫步
while True:
# 创建一个RandomWalk 实例。
    rw = RandomWalk()
    rw.fill_walk()
    # 将所有的点都绘制出来
    fig,ax = plt.subplots()
    point_numbers = range(rw.num_points)
    ax.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,edgecolors='none',s=15)

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

    keep_running = input("是否继续?(y或n)")
    if keep_running == 'n':
        break

3.隐藏坐标轴
import matplotlib.pyplot as plt
from randomwalk import RandomWalk

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

# 只要程序处于活动状态,就不断地模拟随机漫步
while True:
# 创建一个RandomWalk 实例。
    rw = RandomWalk()
    rw.fill_walk()
    # 将所有的点都绘制出来
    fig,ax = plt.subplots()
    point_numbers = range(rw.num_points)
    ax.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,edgecolors='none',s=15)

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

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

    keep_running = input("是否继续?(y或n)")
    if keep_running == 'n':
        break

4.增加点数
import matplotlib.pyplot as plt
from randomwalk import RandomWalk

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

# 只要程序处于活动状态,就不断地模拟随机漫步
while True:
# 创建一个RandomWalk 实例。
    rw = RandomWalk(50_000)
    rw.fill_walk()
    # 将所有的点都绘制出来
    fig,ax = plt.subplots()
    point_numbers = range(rw.num_points)
    ax.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,edgecolors='none',s=1)

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

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

    keep_running = input("是否继续?(y或n)")
    if keep_running == 'n':
        break

5.调整尺寸以合适屏幕
import matplotlib.pyplot as plt
from randomwalk import RandomWalk

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.style.use('ggplot')

# 只要程序处于活动状态,就不断地模拟随机漫步
while True:
# 创建一个RandomWalk 实例。
    rw = RandomWalk(50_000)
    rw.fill_walk()
    # 将所有的点都绘制出来
    fig,ax = plt.subplots(figsize=(15,9))
    point_numbers = range(rw.num_points)
    ax.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,edgecolors='none',s=1)

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

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

    keep_running = input("是否继续?(y或n)")
    if keep_running == 'n':
        break

如果知道屏幕dpi的话,可通过DPI传递参数。
fig,ax = plt.sub
15.4 使用Plotly模拟掷骰子

15.4.1 安装Plotly
跟前面的思路一样:
$ python -m pip install --user plotly

15.4.2 创建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)
15.4.3 掷骰子
from die import Die

# 创建一个D6
die = Die()

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

print(results)
15.4.4 分析结果
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)
15.4.5 绘制直方图
from die import Die
from plotly.graph_objs import Bar, Layout
from plotly import offline

# 创建一个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_value = list(range(1,die.num_sides+1))
data = [Bar(x=x_value,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')
15.4.6 同时掷两个骰子\15.4.7 扔一个10面骰子和一个6面骰子
from die import Die
from plotly.graph_objs import Bar, Layout
from plotly import offline

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


# 掷几次骰子并将结果存储在一个列表中
results = []
for roll_num in range(50000):
    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_value = list(range(2,max_result+1))
data = [Bar(x=x_value,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='two_d6_d10.html')

嗯,感觉这章的内容比外星人简单太多了。有不懂的地方,基本上回头看看就能懂。

到底是为什么把外星人放在第一个项目啊,岂可修,劝退吗?

胭惜雨

2021年02月26日

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据