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一下查看过程, 就更明白怎么实现得了
效果:

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()
结果:

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()
结果:

- 这样就好了,因为规定的输入和输出的值,
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()
结果:

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()
结果:

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
包含或是说提供了输出的值
结果:

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()
效果:

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. 设置随机漫步图的样式
- 给点着色
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

- 重新绘制起点和终点
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

- 隐藏坐标轴
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

-
增加点数
- 实例化时传参就可以了
-
调整尺寸以适合屏幕大小
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. 掷两面不同的骰子
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步