查看全课大纲(第 38 / 51 节)
  1. 1.为什么人人都该学点编程?
  2. 2.计算机与程序设计:你的电脑到底在“想”什么?
  3. 3.Python 这门语言,到底有什么魔力?
  4. 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
  5. 5.如何安装一个更强大的代码编辑器?
  6. 6.汇率兑换1.0:你的第一个“钱生钱”小程序
  7. 7.你的第一行代码,藏着哪些秘密?
  8. 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
  9. 9.汇率兑换程序,如何让它“聪明”地判断币种?
  10. 10.汇率兑换程序能一直运行,直到我喊停吗?
  11. 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
  12. 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
  13. 13.怎么用 Python 画一个会动的五角星?
  14. 14.如何让程序自动画出不同大小的五角星?
  15. 15.函数自己调用自己,会发生什么?
  16. 16.用递归画出神奇的分形树
  17. 17.Python 怎么计算你一天躺着不动能消耗多少热量?
  18. 18.如何让程序“活”起来,持续为你服务?
  19. 19.如何让 BMR 计算器更“聪明”?
  20. 20.当程序遇到“不按套路出牌”的用户怎么办?
  21. 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
  22. 22.如何用列表记录每一周的存款?
  23. 23.如何让程序自己数数?—— 用 for 循环解放你的双手
  24. 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
  25. 25.52周存钱挑战:怎么根据日期自动查存款?
  26. 26.Python 怎么判断一年中的第几天?
  27. 27.列表 vs 元组:哪个更适合存储月份天数?
  28. 28.用集合给月份分个队,换个思路算天数
  29. 29.把月份和天数“锁”在一起:用字典给数据配个对
  30. 30.Python 怎么判断密码强弱?
  31. 31.Python 怎么给密码设置“防沉迷”系统?
  32. 32.Python 怎么把密码保存到文件里?
  33. 33.Python 怎么读取文件里的密码?
  34. 34.Python 怎么把密码检查工具“打包”起来?
  35. 35.Python 怎么把文件操作也“打包”起来?
  36. 36.计算机怎么“扔骰子”?——用Python模拟随机事件
  37. 37.如何用 Python 模拟掷两个骰子?
  38. 38.怎么用 Python 把骰子轨迹画出来?
  39. 39.骰子点数分布长啥样?用直方图一眼看穿!
  40. 40.用科学计算库让骰子程序“起飞”
  41. 41.空气质量指数怎么算?手把手教你写一个AQI计算器
  42. 42.空气质量指数计算:从零开始,让程序看懂空气
  43. 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
  44. 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
  45. 45.Python 怎么让程序自己判断文件类型?
  46. 46.如何让程序自己上网查空气质量?
  47. 47.用美味的汤来解析网页:Beautiful Soup 入门
  48. 48.如何让爬虫自动抓取全国所有城市的空气质量?
  49. 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
  50. 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
  51. 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)的点数是不是普遍偏大?或者,两个骰子有没有连续好几次都投出相同点数的情况?这些在纯数字列表里需要费力寻找的规律,在图上几乎一目了然。

📝 动手练一练

  1. 调整透明度:把上面代码中的 alpha 参数改成 1.0(完全不透明)和 0.2(非常透明),分别运行一下,观察图表有什么变化?你觉得在点非常密集的时候,用哪个透明度更好?
  2. 改变颜色和形状:plt.scatter 函数还有很多参数可以玩。试着把 c='red' 改成 c='blue',或者再加上一个参数 marker='^'(把点变成三角形)。看看图表会变成什么样?
  3. 探索更多:把 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
    下载
看图文没弄懂?展开看本节视频讲解(约 12 分钟)
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)