查看全课大纲(第 38 / 51 节)
- 1.为什么人人都该学点编程?
- 2.计算机与程序设计:你的电脑到底在“想”什么?
- 3.Python 这门语言,到底有什么魔力?
- 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
- 5.如何安装一个更强大的代码编辑器?
- 6.汇率兑换1.0:你的第一个“钱生钱”小程序
- 7.你的第一行代码,藏着哪些秘密?
- 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
- 9.汇率兑换程序,如何让它“聪明”地判断币种?
- 10.汇率兑换程序能一直运行,直到我喊停吗?
- 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
- 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
- 13.怎么用 Python 画一个会动的五角星?
- 14.如何让程序自动画出不同大小的五角星?
- 15.函数自己调用自己,会发生什么?
- 16.用递归画出神奇的分形树
- 17.Python 怎么计算你一天躺着不动能消耗多少热量?
- 18.如何让程序“活”起来,持续为你服务?
- 19.如何让 BMR 计算器更“聪明”?
- 20.当程序遇到“不按套路出牌”的用户怎么办?
- 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
- 22.如何用列表记录每一周的存款?
- 23.如何让程序自己数数?—— 用 for 循环解放你的双手
- 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
- 25.52周存钱挑战:怎么根据日期自动查存款?
- 26.Python 怎么判断一年中的第几天?
- 27.列表 vs 元组:哪个更适合存储月份天数?
- 28.用集合给月份分个队,换个思路算天数
- 29.把月份和天数“锁”在一起:用字典给数据配个对
- 30.Python 怎么判断密码强弱?
- 31.Python 怎么给密码设置“防沉迷”系统?
- 32.Python 怎么把密码保存到文件里?
- 33.Python 怎么读取文件里的密码?
- 34.Python 怎么把密码检查工具“打包”起来?
- 35.Python 怎么把文件操作也“打包”起来?
- 36.计算机怎么“扔骰子”?——用Python模拟随机事件
- 37.如何用 Python 模拟掷两个骰子?
- 38.怎么用 Python 把骰子轨迹画出来?
- 39.骰子点数分布长啥样?用直方图一眼看穿!
- 40.用科学计算库让骰子程序“起飞”
- 41.空气质量指数怎么算?手把手教你写一个AQI计算器
- 42.空气质量指数计算:从零开始,让程序看懂空气
- 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
- 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
- 45.Python 怎么让程序自己判断文件类型?
- 46.如何让程序自己上网查空气质量?
- 47.用美味的汤来解析网页:Beautiful Soup 入门
- 48.如何让爬虫自动抓取全国所有城市的空气质量?
- 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
- 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
- 51.空气质量数据怎么“洗”干净,还能画成图?
怎么用 Python 把骰子轨迹画出来?
约 12 分钟
小象实战讲义 · Python 入门:8 个小项目边玩边学
欢迎回来!上一节我们让程序学会了同时掷两个骰子,并且能统计出每个点数出现的次数和频率。但看着一堆数字,是不是总觉得少了点什么?没错,就是不够直观!
这一节,我们要做一件特别酷的事——把骰子每次投出的点数,用一张图“画”出来。就像给骰子的每次跳跃拍照,然后把所有照片拼在一起,让你一眼就能看到它的“运动轨迹”。学完这一节,你的程序就能生成一张漂亮的散点图,直观展示两个骰子100次投掷的点数分布。
💡 核心导读
- 本节新增什么? 引入
matplotlib库,用散点图可视化骰子的投掷记录。 - 你会学到: 什么是数据可视化,以及如何用几行代码把列表数据变成一张图。
- 你会得到: 一张包含红、绿两种颜色散点的图表,清晰展示两个骰子各自的点数变化轨迹。
从数字到图形:认识数据可视化
我们之前用 print 打印出的结果,比如“点数7的次数:15,频率:0.15”,这叫文本输出。虽然准确,但不够直观,尤其当数据量变大时,很难一眼看出规律。
而数据可视化,就是把数据用图形(比如点、线、柱)表现出来,让我们的大脑能更快地理解和发现信息。在Python里,有一个非常强大且常用的库叫 matplotlib,它就是专门干这个的。
matplotlib 能画出各种各样的图,比如折线图、柱状图、饼图,还有我们马上要用的散点图。散点图特别适合展示一系列数据点的分布情况。
动手画第一个散点图
在画骰子轨迹之前,我们先画一个最简单的散点图热热身。假设我们有三个点,它们的坐标分别是 (1,4), (2,5), (3,6)。
# 引入绘图库
import matplotlib.pyplot as plt
# 准备数据:X坐标和Y坐标分别放在两个列表里
x_coords = [1, 2, 3]
y_coords = [4, 5, 6]
# 绘制散点图:plt.scatter(X坐标列表, Y坐标列表)
plt.scatter(x_coords, y_coords)
# 显示图形
plt.show()运行这段代码,会弹出一个窗口,里面有三个点:(1,4), (2,5), (3,6)。plt.scatter 就像一支笔,按照你给的坐标列表,一个一个把点描在图上。
升级骰子程序:记录每一次投掷
要画出骰子的轨迹,我们需要记录下每一次投掷的结果,而不仅仅是最后的统计次数。所以,我们要在程序中增加两个“记录本”。
本节核心新增代码:在循环投掷骰子的同时,用两个空列表分别记录骰子A和骰子B每一次的点数。
import random
import matplotlib.pyplot as plt
random.seed(42) # 固定随机种子,让示例输出可复现
def roll_dice():
"""模拟掷一次骰子,返回1到6的随机整数"""
return random.randint(1, 6)
# 设置投掷总次数
total_times = 100
# 初始化两个空列表,用于记录每一次的点数
roll1_results = [] # 记录骰子A的点数
roll2_results = [] # 记录骰子B的点数
# 初始化一个字典,用于统计每个总点数的出现次数(2到12)
result_dict = {i: 0 for i in range(2, 13)}
# 开始模拟投掷
for i in range(total_times):
# 投掷两个骰子
roll1 = roll_dice()
roll2 = roll_dice()
# 【新增】记录本次投掷的点数
roll1_results.append(roll1)
roll2_results.append(roll2)
# 计算总点数并更新统计
total_points = roll1 + roll2
result_dict[total_points] += 1
# 打印统计结果(和之前一样)
for points, count in result_dict.items():
frequency = count / total_times
print(f'点数{points}的次数:{count},频率:{frequency:.2f}')
print("骰子A的记录:", roll1_results[:10], "...") # 只打印前10个看看
print("骰子B的记录:", roll2_results[:10], "...")点数2的次数:3,频率:0.03
点数3的次数:4,频率:0.04
点数4的次数:5,频率:0.05
点数5的次数:17,频率:0.17
点数6的次数:10,频率:0.10
点数7的次数:24,频率:0.24
点数8的次数:9,频率:0.09
点数9的次数:16,频率:0.16
点数10的次数:3,频率:0.03
点数11的次数:5,频率:0.05
点数12的次数:4,频率:0.04
骰子A的记录: [6, 1, 3, 2, 6, 6, 5, 5, 1, 1] ...
骰子B的记录: [1, 6, 2, 2, 1, 6, 1, 4, 1, 2] ...(代码里固定了 random.seed(42),所以你运行会得到和上面完全一样的结果;删掉这一行才会每次随机变化。)
看,roll1_results 和 roll2_results 就像两个流水账,把骰子A和B每一次的点数都记下来了。有了这个,我们就可以画图了!
绘制骰子轨迹散点图
现在,我们要把“流水账”变成“轨迹图”。
- X轴(横坐标):我们用它表示“第几次投掷”,所以是 1, 2, 3, …, 100。
- Y轴(纵坐标):就是每次投掷得到的点数,也就是
roll1_results或roll2_results列表里的值。
这样,第一次投掷就在 (1, 点数) 的位置画一个点,第二次在 (2, 点数) 的位置画点……连起来就成了轨迹。
import matplotlib.pyplot as plt
# 由于每个代码块需要独立运行,我们重新构造数据
# 这里用一个固定的随机种子,确保你看到的输出和图表与讲义一致
import random
random.seed(10) # 设置随机种子,固定随机结果
total_times = 100
roll1_results = []
roll2_results = []
for i in range(total_times):
roll1_results.append(random.randint(1, 6))
roll2_results.append(random.randint(1, 6))
# 生成X轴坐标:第1次,第2次,...,第100次
x_values = list(range(1, total_times + 1))
# 绘制骰子A的轨迹(红色点)
plt.scatter(x_values, roll1_results, c='red', alpha=0.5, label='骰子A')
# 绘制骰子B的轨迹(绿色点)
plt.scatter(x_values, roll2_results, c='green', alpha=0.5, label='骰子B')
plt.xlabel('投掷次数') # 给X轴加标签
plt.ylabel('骰子点数') # 给Y轴加标签
plt.title('模拟掷两个骰子100次的结果散点图') # 给图表加标题
plt.legend() # 显示图例
plt.show()运行后,你会看到一张散点图。图中:
- 红色点代表骰子A,绿色点代表骰子B。
- 点越靠上,表示那次投掷的点数越大(比如6点);越靠下,点数越小(比如1点)。
- 参数
alpha=0.5设置了点的透明度。当很多点重叠在一起时,颜色会加深,这样你就能看出哪些点数区域更“密集”。
是不是一下子清晰多了? 你可以一眼看出,在某个时间段(比如第20到40次),绿色骰子(B)的点数是不是普遍偏大?或者,两个骰子有没有连续好几次都投出相同点数的情况?这些在纯数字列表里需要费力寻找的规律,在图上几乎一目了然。
📝 动手练一练
- 调整透明度:把上面代码中的
alpha参数改成1.0(完全不透明)和0.2(非常透明),分别运行一下,观察图表有什么变化?你觉得在点非常密集的时候,用哪个透明度更好? - 改变颜色和形状:
plt.scatter函数还有很多参数可以玩。试着把c='red'改成c='blue',或者再加上一个参数marker='^'(把点变成三角形)。看看图表会变成什么样? - 探索更多:把
total_times从100改成500甚至1000,再运行程序。当投掷次数非常多的时候,散点图看起来像什么?点数在1-6之间的分布显得均匀吗?
👉 点击查看第2题参考答案
plt.scatter 函数可以通过 c 参数设置颜色,通过 marker 参数设置点的形状。以下是一些常见选项:
import matplotlib.pyplot as plt
# 示例数据
x = [1, 2, 3, 4, 5]
y = [2, 4, 1, 5, 3]
# 绘制蓝色三角形散点
plt.scatter(x, y, c='blue', marker='^', alpha=0.7, label='蓝色三角')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.title('自定义颜色和形状的散点图')
plt.legend()
plt.show()你可以尝试的其他 marker 值:'o' (圆点,默认), 's' (正方形), '*' (星形), '+' (加号), 'x' (叉号)。颜色也可以用英文名,如 'cyan' (青色), 'magenta' (洋红),或者用RGB元组,如 c=(0.2, 0.8, 0.4)。
本章小结
恭喜!你的“模拟掷骰子”项目成功升级到了3.0版本,拥有了数据可视化的超能力。你现在不仅能让程序模拟随机事件、进行统计,还能把结果用直观的图表展示出来。
📋 行动清单
- 运行本节最终代码,亲眼看看两个骰子100次投掷的轨迹散点图。
- 尝试修改代码:改改颜色、透明度,或者把投掷次数调到1000次,观察图形的变化。
- 想一想:散点图展示了每次投掷的“轨迹”,但它能直接告诉我们“点数7出现了多少次”吗?如果不能,我们还需要什么图?
散点图很棒,但它主要展示的是“每一次”的记录。如果我们想一眼看清“每个点数总共出现了多少次”,也就是数据的分布情况,该怎么办呢?下一节,我们将请出数据统计的利器——直方图,让它来给我们一个更清晰的答案。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第8章代码包:模拟掷骰子(含全部版本 5 个 .py)ZIP · 3KB