Python编程从入门到实践_第十五章_生成数据

第十五章:生成数据


  • 数据分析使用代码来探索数据集的规律和关联
  • 数据可视化通过可视化来探索数据,通过引人注目的方式呈现数据,能让观看者明白其含义,发现数据集中原本未知规律和意义
  • 数据可视化最流行的工具之一是Matplotlib

15.1 安装Matplotlib

import matplotlib

print(matplotlib.__version__)

15.2 绘制简单的折线图

任务: 使用平方数序列绘制简单的折线图

import matplotlib.pyplot as plt #导入pyplot子模块

squares = [1,4,9,16,25]  #创建列表存储制作列表的数据
fig, ax = plt.subplots() #调用subplots(),可在一张图片中绘制一个或多个图标,变量fig表示整个图表,变量ax表示图片中的各个图表
ax.plot(squares) #调用方法plot(),根据给定的数据以有意义的方式绘制图表

plt.show() #打开Matplotlib查看器并显示绘制的图表
  • Pyplot 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。

  • Pyplot 是常用的绘图模块,能很方便让用户绘制 2D 图表。

  • Pyplot 包含一系列绘图函数的相关函数,每个函数会对当前的图像进行一些修改,例如:给图像加上标记,生新的图像,在图像中产生新的绘图区域等等。

15.2.1 修改标签文字和线条粗细

任务: 改善图表的可读性

import matplotlib.pyplot as plt #导入pyplot子模块

# 解决中文问题
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号

squares = [1,4,9,16,25]  #创建列表存储制作列表的数据
fig, ax = plt.subplots() #调用subplots(),可在一张图片中绘制一个或多个图标,变量fig表示整个图表,变量ax表示图片中的各个图表
ax.plot(squares, linewidth=3) #调用方法plot(),根据给定的数据以有意义的方式绘制图表


# 设置图表标题并给坐标轴加上标签
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.2 校正图形

import matplotlib.pyplot as plt #导入pyplot子模块

# 解决中文问题
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号

input_values = [1,2,3,4,5]
squares = [1,4,9,16,25]  #创建列表存储制作列表的数据
fig, ax = plt.subplots() #调用subplots(),可在一张图片中绘制一个或多个图标,变量fig表示整个图表,变量ax表示图片中的各个图表
ax.plot(input_values, squares, linewidth=3) #调用方法plot(),根据给定的数据以有意义的方式绘制图表


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

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

plt.show()
#查看函数参数
plt.plot?

15.2.3 使用内置样式

import matplotlib.pyplot as plt

plt.style.available
import matplotlib.pyplot as plt #导入pyplot子模块


input_values = [1,2,3,4,5]
squares = [1,4,9,16,25]  #创建列表存储制作列表的数据

plt.style.use('seaborn')
fig, ax = plt.subplots() #调用subplots(),可在一张图片中绘制一个或多个图标,变量fig表示整个图表,变量ax表示图片中的各个图表
ax.plot(input_values, squares, linewidth=3) #调用方法plot(),根据给定的数据以有意义的方式绘制图表


# 设置图表标题并给坐标轴加上标签
ax.set_title("Squares", fontsize=24)
ax.set_xlabel("Value", fontsize=14)
ax.set_ylabel("Square", fontsize=14)

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

plt.show()

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

  • 散点图(Scatter Graph, PointGraph, X-Y Plot, Scatter Chart或者 Scattergram)是科研绘图中最常见的图形类型之一,通常用于显示和比较数值。
  • 散点图是使用一系列的散点在直角坐标系中展示变量的数值分布。在二维散点图中,可以通过观察两个变量的数据分析,发现两者的关系与相关性。
  • 散点图可以提供三类关键信息:
    1. 变量之间是否存在数量关联趋势;
    2. 如果存在关联趋势,是线性还是非线性的;
    3. 观察是否有存在离群值,从而分析这些离群值对建模分析的影响。
import matplotlib.pyplot as plt

plt.style.use('seaborn')
fig,ax = plt.subplots()
ax.scatter(2,4)

plt.show()
import matplotlib.pyplot as plt

plt.style.use('seaborn')
fig,ax = plt.subplots()
ax.scatter(2,4, s=200)

# 设置图表标题并给坐标轴加上标签
ax.set_title("Squares", fontsize=24)
ax.set_xlabel("Value", fontsize=14)
ax.set_ylabel("Square", fontsize=14)

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

plt.show()

15.2.5 使用scatter()绘制一系列点

import matplotlib.pyplot as plt

x_values = [1,2,3,4,5]
y_values = [1,4,9,16,25]  #创建列表存储制作列表的数据

plt.style.use('seaborn')
fig,ax = plt.subplots()
ax.scatter(x_values,y_values, s=100)

# 设置图表标题并给坐标轴加上标签
ax.set_title("Squares", fontsize=24)
ax.set_xlabel("Value", fontsize=14)
ax.set_ylabel("Square", fontsize=14)

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

plt.show()

15.2.6 自动计算数据

import matplotlib.pyplot as plt

x_values = range(1, 1001)
y_values = [x**2 for x in x_values]  #创建列表存储制作列表的数据

plt.style.use('seaborn')
fig,ax = plt.subplots()
ax.scatter(x_values,y_values, s=10)

# 设置图表标题并给坐标轴加上标签
ax.set_title("Squares", fontsize=24)
ax.set_xlabel("Value", fontsize=14)
ax.set_ylabel("Square", fontsize=14)

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

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

plt.show()

15.2.7 自定义颜色

任务: 打开并读取“pi_million_digits.txt”,并打印小数点后50位

import matplotlib.pyplot as plt

x_values = range(1, 1001)
y_values = [x**2 for x in x_values]  #创建列表存储制作列表的数据

plt.style.use('seaborn')
fig,ax = plt.subplots()
ax.scatter(x_values,y_values,c='red', s=10) #设置散点颜色为红色

# 设置图表标题并给坐标轴加上标签
ax.set_title("Squares", fontsize=24)
ax.set_xlabel("Value", fontsize=14)
ax.set_ylabel("Square", fontsize=14)

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

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

plt.show()
import matplotlib.pyplot as plt

x_values = range(1, 1001)
y_values = [x**2 for x in x_values]  #创建列表存储制作列表的数据

plt.style.use('seaborn')
fig,ax = plt.subplots()
ax.scatter(x_values,y_values,c=(0, 0.8, 0), s=10) #使用RGB格式设置散点颜色

# 设置图表标题并给坐标轴加上标签
ax.set_title("Squares", fontsize=24)
ax.set_xlabel("Value", fontsize=14)
ax.set_ylabel("Square", fontsize=14)

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

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

plt.show()

15.2.8 使用颜色映射

  • 颜色映射(colormap): 多种颜色合在一起的颜色条或者渐变色。较浅的颜色表示较小的值,较深的颜色表示较大的值。
import matplotlib.pyplot as plt

x_values = range(1, 1001)
y_values = [x**2 for x in x_values]  #创建列表存储制作列表的数据

plt.style.use('seaborn')
fig,ax = plt.subplots()
ax.scatter(x_values,y_values,c=y_values, cmap=plt.cm.Reds, s=10) #使用RGB格式设置散点颜色

# 设置图表标题并给坐标轴加上标签
ax.set_title("Squares", fontsize=24)
ax.set_xlabel("Value", fontsize=14)
ax.set_ylabel("Square", fontsize=14)

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

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

plt.show()

15.2.9 自动保存图表

import matplotlib.pyplot as plt

x_values = range(1, 1001)
y_values = [x**2 for x in x_values]  #创建列表存储制作列表的数据

plt.style.use('seaborn')
fig,ax = plt.subplots()
ax.scatter(x_values,y_values,c=y_values, cmap=plt.cm.Reds, s=10) #使用RGB格式设置散点颜色

# 设置图表标题并给坐标轴加上标签
ax.set_title("Squares", fontsize=24)
ax.set_xlabel("Value", fontsize=14)
ax.set_ylabel("Square", fontsize=14)

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

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

#plt.show()
plt.savefig('square_plot.png', bbox_inches='tight')

15.3 随机漫步

  • **随机漫步(Random Walk)**每次行走都完全是随机的,没有明确的方向,结果是由一系列随机决策决定的。你可以这样认为,随机漫步就是蚂蚁在晕头转向的情况下,每次都沿随机的方向所经过的路径。

15.3.1 创建RandomWalk()类

任务: 创建一个名为RandomWalk()的类,随机的选择前进方向。类包含3个属性:一个存储随机漫步次数的变量,两个列表存储随机漫步经过的每个点的x坐标和y坐标

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)

15.3.3 绘制随机漫步图

import matplotlib.pyplot as plt
#from random_walk import 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()

15.3.3 模拟多次随机漫步

import matplotlib.pyplot as plt
#from random_walk import RandomWalk

while True:
    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

15.3.4 设置随机漫步图的样式

给点着色

我们将使用颜色映射出漫步中个点的先后顺序,并删除各个点的黑色轮廓,让他们颜色更加明显。为根据漫步中各点的先后顺序进行着色,我们传递参数c,并设置一个列表,其中包含各点的先后顺序。由于这些点都是按顺序绘制的,因此参数c指定的列表只需包含数字1~5000即可。

import matplotlib.pyplot as plt
#from random_walk import RandomWalk

while True:
    # 创建一个RandWalk实例,并将其包含的点都绘制出来
    rw = RandomWalk()
    rw.fill_walk()

    #将所有的点都绘制出来
    plt.style.use('classic')
    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('Make another walk? (y/n) : ')
    if keep_running == 'n':
        break
  • 我们使用range生成了一个数字列表,其中包含的数字与漫步包含的点数相同。接下来,我们将这个列表存储到point_numbers中,以方便使用它设置每个漫步点的颜色。我们将每个参数c设置为point_numbers,指定颜色映射为蓝色,并传递实参edgecolors以删除每个点周围的轮廓。最终的随机漫步图由浅蓝色渐变为深蓝色。

重新绘制起点和终点

import matplotlib.pyplot as plt
#from random_walk import RandomWalk

while True:
    # 创建一个RandWalk实例,并将其包含的点都绘制出来
    rw = RandomWalk()
    rw.fill_walk()

    #将所有的点都绘制出来
    plt.style.use('classic')
    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=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
  • 为突出起点,我们使用绿色绘制点(0,0),并使其比其它点大。为突出终点,我们在漫步包含的最后一个x值和y值处绘制一个点,使其为红色,并比其它点大。运行代码,将准确知道每次随机漫步的起点和终点。

隐藏坐标轴

下面来隐藏坐标轴,以免我们注意点是坐标轴而不是随机漫步路径。

import matplotlib.pyplot as plt
#from random_walk import RandomWalk

while True:
    # 创建一个RandWalk实例,并将其包含的点都绘制出来
    rw = RandomWalk()
    rw.fill_walk()

    #将所有的点都绘制出来
    plt.style.use('classic')
    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=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
    

增加点数

增加点数,以提供更多数据

import matplotlib.pyplot as plt
#from random_walk import RandomWalk

while True:
    # 创建一个RandWalk实例,并将其包含的点都绘制出来
    rw = RandomWalk(50_000)
    rw.fill_walk()

    #将所有的点都绘制出来
    plt.style.use('classic')
    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=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

调整尺寸以适合屏幕

图表适合屏幕大小时,能有效地将数据中的规律呈现出来

import matplotlib.pyplot as plt
#from random_walk import RandomWalk

while True:
    # 创建一个RandWalk实例,并将其包含的点都绘制出来
    rw = RandomWalk(50_000)
    rw.fill_walk()

    #将所有的点都绘制出来
    plt.style.use('classic')
    fig, ax = plt.subplots(figsize=(15,9),dpi=128)
    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=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

15.4 使用plotly模拟掷骰子

  • 使用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
# 创建一个6面骰子D6
die = Die()

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

15.4.4 分析结果

任务: 分析D6的结果,计算每个点数出现的次数

#from die import Die

# 创建一个6面骰子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

# 创建一个6面骰子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': 'Result'}
y_axis_config = {'title': 'Frequency of Result'}
my_layout = Layout(title='Results of rolling one D6 1000 times',
        xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({'data': data, 'layout': my_layout}, filename='d6.html')

15.4.6 同时掷两个骰子

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

#from die import Die

# 创建2个D6
die_1 = Die()
die_2 = Die()

# 掷几次骰子并将结果记录在列表中
results = []
for roll_num in range(1000):
    result = die_1.roll() + die_2.roll()
    results.append(result)
    
# 分析结果
frequencies = []
max_result = die_1.num_sides + die_2.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': 'Result', 'dtick': 1}
y_axis_config = {'title': 'Frequency of Result'}
my_layout = Layout(title='Results of rolling two D6 dice 1000 times',
        xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({'data': data, 'layout': my_layout}, filename='d6_d6.html')

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

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

#from die import Die

# 创建1个D6和1个D10
die_1 = Die()
die_2 = Die(10)

# 掷几次骰子并将结果记录在列表中
results = []
for roll_num in range(50_000):
    result = die_1.roll() + die_2.roll()
    results.append(result)
    
# 分析结果
frequencies = []
max_result = die_1.num_sides + die_2.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': 'Result', 'dtick': 1}
y_axis_config = {'title': 'Frequency of Result'}
my_layout = Layout(title='Results of rolling a D6 and a D10 50000 times',
        xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({'data': data, 'layout': my_layout}, filename='d6_d10.html')

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值