2.Python数据可视化_ 生成数据

生成数据

1. 绘制简单的折线图

import matplotlib.pyplot as plt  # 引入matplotlib包里的pyplot模块, 因为用的多所以别名

squares = [1, 4, 9, 16, 25]  # 储存用来制作表的数据(用的是平方序列)
fig, ax = plt.subplots()  # subplots()函数, 返回两个值:1,整张图片;2,图片中的各个表格
ax.plot(squares)  # 根据给定的参数(数据)以有意义的方式绘制图标
# 以上步骤已经在后台创建了相关的表格了, 下一行代码就是为了把后台创建好的数据拿到前台来
plt.show()  # 此函数可以打开Matplotlib查看器并绘制图表
# 可自行Debug一下查看过程, 就更明白怎么实现得了

效果:

image-20220920200157581

1. 修改标签文字和线条粗细

import matplotlib.pyplot as plt


squares = [1, 4, 9, 16, 25]
fig, ax = plt.subplots()
ax.plot(squares, linewidth=3)  # 另一个参数规定了线的粗细
# 设置图表的标题并给坐标轴加上标签(最好为英语的)
ax.set_title("Square Number", fontsize=14)  # 给图表指定标题
ax.set_xlabel("value", fontsize=14)  # 给X轴指定标题
ax.set_ylabel("Square Of Value", fontsize=14)  # 给Y轴指定标题
# 设置刻度标记的大小
ax.tick_params(axis='both', labelsize=14)  # 设置轴的刻度的样式
plt.show()

结果:

image-20220920201929260

2. 校正图片

  • 因为他是按照自己的认为按着有意义的做法而生成的, 所以会有误差,差错
  • plot()函数默认第一个数据对应的 X 坐标值为0
  • 但我们给的数据第一个值不是零, 我们可以向plot()同时提供输入值和输出值
import matplotlib.pyplot as plt


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("Square Number", fontsize=14)
ax.set_xlabel("value", fontsize=14)
ax.set_ylabel("Square Of Value", fontsize=14)
ax.tick_params( labelsize=14)

plt.show()

结果:

image-20220920202924797
  • 这样就好了,因为规定的输入和输出的值, plot()函数就无须对输出值进行假设了

3. 使用内置样式

  • 在终端先进入Python之后运行: import matplotlib.pyplot as plt; plt.style.available 就可以看到有那种样式

  • 要使用这些样式只要在画表(把图标赋值给变量)前加上 --- plt.style.use('样式名')就OK

import matplotlib.pyplot as plt


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

plt.style.use('seaborn-v0_8')  # 指定样式
fig, ax = plt.subplots()

ax.plot(input_values, squares, linewidth=3)
ax.set_title("Square Number", fontsize=14)
ax.set_xlabel("value", fontsize=14)
ax.set_ylabel("Square Of Value", fontsize=14)
ax.tick_params( labelsize=14)

plt.show()

结果:

image-20220920203841179

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

  • 绘制单个点使用方法scatter()向他传递一对X和Y的值, 他就会在指定位置绘制一个点
import matplotlib.pyplot as plt


plt.style.use('seaborn-v0_8')
fig, ax = plt.subplots()  # 创建"画布"和图表
ax.scatter(2, 4, s=200)  # 在图表中绘制出一个点, s表示点的大小

# 设置图表的标题并给坐标轴加上标签(最好为英语的)
ax.set_title("Square Number", fontsize=14)  # 给图表指定标题
ax.set_xlabel("value", fontsize=14)  # 给X轴指定标题
ax.set_ylabel("Square Of Value", fontsize=14)  # 给Y轴指定标题
# 设置刻度标记的大小
ax.tick_params(axis='both', which='major', labelsize=14)  # 设置轴的刻度的样式 which指定对那个数使用样式

plt.show()

结果:

image-20220920211431032

5. 使用scatter()绘制一系列的点

  • 可以向scatter()传递分别包含x值和y值得列表
import matplotlib.pyplot as plt


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

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


ax.set_title("Square Number", fontsize=14)  
ax.set_xlabel("value", fontsize=14)  
ax.set_ylabel("Square Of Value", fontsize=14) 

ax.tick_params(axis='both', which='major', labelsize=14)  

plt.show()
  • 其中 x_values包含或是说提供了输入的值(x值), y_values包含或是说提供了输出的值

结果:

image-20220920211404295

6. 自动计算数据

"""绘制1000个点"""
import matplotlib.pyplot as plt


x_values = range(1, 1001)  # x轴的数
y_values = [x**2 for x in x_values]  # 在这一步计算数据,先循环得到x轴的值,再把他们计算平方, 放在列表里

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

ax.set_title("Square Number", fontsize=14)
ax.set_xlabel("value", fontsize=14)
ax.set_ylabel("Square Of Value", fontsize=14)
ax.axis([0, 1100, 0, 1100000])  # 设置每个坐标轴的取值范围

plt.show()

效果:

7. 自定义颜色

  • scatter()传递参数c并将其设置为想要使用的颜色
  • ax.scatter(x_values, y_values, s=100, c='#e06c75')

8. 使用颜色映射

  • 颜色映射是一系列的颜色, 从起始颜色到结束颜色, 在可视化中, 颜色对的映射用于突出数据的规律

  • pyplot模块内置了一组颜色映射

    """绘制1000个点"""
    import matplotlib.pyplot as plt
    
    
    x_values = range(1, 1001)
    y_values = [x**2 for x in x_values]
    plt.style.use('seaborn-v0_8')
    fig, ax = plt.subplots()
    # 给参数c设置成一个y的列表,并用参数camp高数pyplot使用哪个颜色映射
    ax.scatter(x_values, y_values, s=100, c=y_values, cmap=plt.cm.Blues)
    
    ax.set_title("Square Number", fontsize=14)
    ax.set_xlabel("value", fontsize=14)
    ax.set_ylabel("Square Of Value", fontsize=14)
    ax.axis([0, 1100, 0, 1100000])
    
    plt.show()
    
    

效果:

image-20220921150524749

9. 自动保存图表

  • 只要把plt.show()改为plt.savefig('文件名要加后缀', bbox_inches='tight') 第二个参数是指定将图表多余的空白部分裁减掉, 如果想要保留空白部分, 则省略这个实参即可

  • 文件还会放在当前项目所在的文件夹中

  • 他不会显示, 只会保存

2. 随机漫步

  • 随机漫步是每次行走都是完全随机的, 没有明确的方向, 结果是由一系列随机决策决定的

1. 创建RandomWalk类

  • 用它来随机的选择前进的方向
  • 需要三个属性:
    • 储存随机漫步的次数
    • 储存每个点的x坐标(列表)
    • 储存每个点的y坐标(列表)
  • 两个方法
    • __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]
        

2. 选择方向

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

"""接着上述代码"""
 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_distance * x_direction  # 方向+步数就为在x上移动的距离

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

            # 拒绝原地踏步
            if x_step == 0 and y_step == 0:
                continue  # 原地踏步则结束当前循环

            # 计算下一个点的x值和y值
            x = self.x_values[-1] + x_step  # 列表最后一个值加上当前步数作为下一步的x值
            y = self.y_values[-1] + y_step
			# 把下一个点的值附加到列表中
            self.x_values.append(x)  
            self.y_values.append(y)
            

3. 制作随机漫步图

import matplotlib.pyplot as plt
from random_walk import RandomWalk


# 创建一个RandomWalk实例
rw = RandomWalk()
rw.fill_walk()  # 调用方法, 为x和y的values添加随机值
# 把所有的点都绘制出来
plt.style.use('classic')
fig, ax = plt.subplots()
ax.scatter(rw.x_values, rw.y_values, s=15)
plt.show()

4. 模拟多次随机漫步

放在while循环里就可以了

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)\n')
    if keep_running == 'n':
        break

5. 设置随机漫步图的样式

  1. 给点着色
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()
    # 给点着色
    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)  # edgecolors 指定每个点的周围的轮廓

    plt.show()

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

image-20220921165426073
  1. 重新绘制起点和终点
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()

    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)\n')
    if keep_running == 'n':
        break

image-20220921165357529
  1. 隐藏坐标轴
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()

    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)\n')
    if keep_running == 'n':
        break

image-20220921165332966
  1. 增加点数

    • 实例化时传参就可以了
  2. 调整尺寸以适合屏幕大小

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(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=15)

    plt.show()

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

3. 使用Plotly模拟掷骰子

1. 创建Die类

from random import randint


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

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

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

2. 掷骰子

from de import Die


# 创建一个D6

die = Die()

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

print(results)

3. 分析结果

from de import Die


die = Die()

results = []
for roll_num in range(100):  # 掷骰子1000次
    result = die.roll()
    results.append(result)

# 分析结果
frequencies = []
for value in range(1, die.num_sides+1):  # 循环骰子面数
    frequency = results.count(value)  # count(value)计算value出现的次数
    frequencies.append(frequency)

print(frequencies)

4. 绘制直方图

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


die = Die()

results = []
for roll_num in range(100):  # 掷骰子1000次
    result = die.roll()
    results.append(result)

# 分析结果
frequencies = []
for value in range(1, die.num_sides+1):  # 循环骰子面数
    frequency = results.count(value)  # count(value)计算value出现的次数
    frequencies.append(frequency)

# 对结果进行可视化
x_values = list(range(1, die.num_sides+1))  # 将可能出现的点数储存在列表中
data = [Bar(x=x_values, y=frequencies)]

x_axis_config = {'title': '结果'}  # 配置x坐标轴
y_axis_config = {'title': '结果频率'}  # 配置y坐标轴
my_layout = Layout(title='掷一个D6 1000次的结果',
                   xaxis=x_axis_config, yaxis=y_axis_config)  # 返回一个指定的图表和配置对象
offline.plot({'data': data, 'layout': my_layout}, filename='d6.html')  # 传入数据, 输出表格

5. 同时掷两个骰子

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

# 创建两个骰子
die_1 = Die()
die_2 = Die()

results = []
for roll_num in range(100):  # 掷骰子1000次
    result = die_1.roll() + die_2.roll()
    results.append(result)

# 分析结果
frequencies = []
for value in range(2, die_1.num_sides + die_2.num_sides + 1):  # 两个骰子之和大于等于2
    frequency = results.count(value)  # count(value)计算value出现的次数
    frequencies.append(frequency)

# 对结果进行可视化
x_values = list(range(2, die_1.num_sides + die_2.num_sides + 1))  # 将可能出现的点数储存在列表中
data = [Bar(x=x_values, y=frequencies)]

x_axis_config = {'title': '结果', 'dtick': 1}  # 配置x坐标轴, dtick键 设定x轴显示的刻度间距
y_axis_config = {'title': '结果频率'}  # 配置y坐标轴
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')

6. 掷两面不同的骰子



posted @   VarFa  阅读(231)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示