Python应用实例(二)数据可视化(三)

news2024/11/15 10:45:14

数据可视化(三)

  • 1.使用Plotly模拟掷骰子
    • 1.1 安装Plotly
    • 1.2 创建Die类
    • 1.3 掷骰子
    • 1.4 分析结果
    • 1.5 绘制直方图
    • 1.6 同时掷两个骰子
    • 1.7 同时掷两个面数不同的骰子

1.使用Plotly模拟掷骰子

本节将使用Python包Plotly来生成交互式图表。需要创建在浏览器中显示的图表时,Plotly很有用,因为它生成的图表将自动缩放以适合观看者的屏幕。Plotly生成的图表还是交互式的:用户将鼠标指向特定元素时,将突出显示有关该元素的信息。

在这个项目中,我们将对掷骰子的结果进行分析。抛掷一个6面的常规骰子时,可能出现的结果为1~6点,且出现每种结果的可能性相同。然而,如果同时掷两个骰子,某些点数出现的可能性将比其他点数大。为确定哪些点数出现的可能性最大,将生成一个表示掷骰子结果的数据集,并根据结果绘制一个图形。

在数学领域,掷骰子常被用来解释各种数据分析类型,而它在赌场和其他博弈场景中也有实际应用,在游戏《大富翁》以及众多角色扮演游戏中亦如此。

1.1 安装Plotly

要安装Plotly,可像本章前面安装Matplotlib那样使用pip:

$ python -m pip install --user plotly

在前面安装Matplotlib时,如果使用了python3之类的命令,这里也要使用同样的命令。要了解使用Plotly可创建什么样的图表,请在其官方网站查看图表类型画廊。

每个示例都包含源代码,让你知道这些图表是如何生成的。

1.2 创建Die类

为模拟掷一个骰子的情况,我们创建下面的类:die.py

  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)

方法__init__()接受一个可选参数。创建这个类的实例时,如果没有指定任何实参,面数默认为6;如果指定了实参,这个值将用于设置骰子的面数(见❶)。骰子是根据面数命名的,6面的骰子名为D6,8面的骰子名为D8,依此类推。

方法roll()使用函数randint()来返回一个1和面数之间的随机数(见❷)。这个函数可能返回起始值1、终止值num_sides或这两个值之间的任何整数。

1.3 掷骰子

使用这个类来创建图表前,先来掷D6,将结果打印出来,并确认结果是合理的:die_visual.py

  from die import Die

  # 创建一个D6。
❶ die = Die()

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

  print(results)

在❶处,创建一个Die实例,其面数为默认值6。在❷处,掷骰子100次,并将每次的结果都存储在列表results中。下面是一个示例结果集:

[4, 6, 5, 6, 1, 5, 6, 3, 5, 3, 5, 3, 2, 2, 1, 3, 1, 5, 3, 6, 3, 6, 5, 4,
 1, 1, 4, 2, 3, 6, 4, 2, 6, 4, 1, 3, 2, 5, 6, 3, 6, 2, 1, 1, 3, 4, 1, 4,
 3, 5, 1, 4, 5, 5, 2, 3, 3, 1, 2, 3, 5, 6, 2, 5, 6, 1, 3, 2, 1, 1, 1, 6,
 5, 5, 2, 2, 6, 4, 1, 4, 5, 1, 1, 1, 4, 5, 3, 3, 1, 3, 5, 4, 5, 6, 5, 4,
 1, 5, 1, 2]

通过快速浏览这些结果可知,Die类似乎没有问题。我们见到了值1和6,表明返回了最大和最小的可能值;没有见到0或7,表明结果都在正确的范围内;还看到了1~6的所有数字,表明所有可能的结果都出现了。下面来确定各个点数都出现了多少次。

1.4 分析结果

为分析掷一个D6的结果,计算每个点数出现的次数:die_visual.py

  --snip--
  # 掷几次骰子并将结果存储在一个列表中。
  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)

由于将使用Plotly来分析,而不是将结果打印出来,因此可将模拟掷骰子的次数增加到1000(见❶)。为分析结果,我们创建空列表frequencies,用于存储每种点数出现的次数。在❷处,遍历可能的点数(这里为1~6),计算每种点数在results中出现了多少次(见❸),并将这个值附加到列表frequencies的末尾(见❹)。接下来,在可视化之前将这个列表打印出来:

[155, 167, 168, 170, 159, 181]

结果看起来是合理的:有6个值,对应掷D6时可能出现的每个点数;另外,没有任何点数出现的频率比其他点数高很多。下面来可视化这些结果。

1.5 绘制直方图

有了频率列表,就可以绘制一个表示结果的直方图了。直方图是一种条形图,指出了各种结果出现的频率。创建这种直方图的代码如下:die_visual.py

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

  from die import Die
  --snip--

  # 分析结果。
  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': '结果'}
  y_axis_config = {'title': '结果的频率'}
❹ my_layout = Layout(title='掷一个D6 1000次的结果',
          xaxis=x_axis_config, yaxis=y_axis_config)
❺ offline.plot({'data': data, 'layout': my_layout}, filename='d6.html')

为创建直方图,需要为每个可能出现的点数生成一个条形。我们将可能出现的点数(1到骰子的面数)存储在一个名为x_values的列表中(见❶)。Plotly不能直接接受函数range()的结果,因此需要使用函数list()将其转换为列表。Plotly类Bar()表示用于绘制条形图的数据集(见❷),需要一个存储[插图]值的列表和一个存储[插图]值的列表。这个类必须放在方括号内,因为数据集可能包含多个元素。

每个坐标轴都能以不同的方式进行配置,而每个配置选项都是一个字典元素。这里只设置了坐标轴标签(见❸)。类Layout()返回一个指定图表布局和配置的对象(见❹)。这里设置了图表名称,并传入了[插图]轴和[插图]轴的配置字典。

为生成图表,我们调用了函数offline.plot()(见❺)。这个函数需要一个包含数据和布局对象的字典,还接受一个文件名,指定要将图表保存到哪里。这里将输出存储到文件d6.html。

运行程序die_visual.py时,可能打开浏览器并显示文件d6.html。如果没有自动显示d6.html,可在任意Web浏览器中新建一个标签页,再在其中打开文件d6.html(它位于die_visual.py所在的文件夹中)。你将看到一个类似于图所示的图表。(为方便印刷,我稍微修改了这个图表。在默认情况下,Plotly所生成图表的文本比图所示的要小。)

在这里插入图片描述

注意,Plotly让这个图表具有交互性:如果将鼠标指向其中的任意条形,就能看到与之相关联的数据。在同一个图表中绘制多个数据集时,这项功能特别有用。另外,注意到右上角有一些图标,让你能够平移和缩放图表以及将其保存为图像。

1.6 同时掷两个骰子

同时掷两个骰子时,得到的点数更多,结果分布情况也不同。下面来修改前面的代码,创建两个D6以模拟同时掷两个骰子的情况。每次掷两个骰子时,都将两个骰子的点数相加,并将结果存储在results中。请复制die_visual.py并将其保存为dice_visual.py,再做如下修改:

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

  from die import Die

  # 创建两个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': '结果', 'dtick': 1}
  y_axis_config = {'title': '结果的频率'}
  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')

创建两个Die实例后,掷骰子多次,并计算每次的总点数(见❶)。可能出现的最大点数为两个骰子的最大可能点数之和(12),这个值存储在max_result中(见❷)。可能出现的最小总点数为两个骰子的最小可能点数之和(2)。分析结果时,计算2到max_result的各种点数出现的次数(见❸)。(我们原本可以使用range(2, 13),但这只适用于两个D6。模拟现实世界的情形时,最好编写可轻松模拟各种情形的代码。前面的代码让我们能够模拟掷任意两个骰子的情形,不管这些骰子有多少面。)

创建图表时,在字典x_axis_config中使用了dtick键(见❹)。这项设置指定了[插图]轴显示的刻度间距。这里绘制的直方图包含的条形更多,Plotly默认只显示某些刻度值,而设置’dtick’: 1让Plotly显示每个刻度值。另外,我们还修改了图表名称及输出文件名。

在这里插入图片描述

这个图表显示了掷两个D6时得到的大致结果。如你所见,总点数为2或12的可能性最小,而总点数为7的可能性最大。这是因为在下面6种情况下得到的总点数都为7:1和6、2和5、3和4、4和3、5和2以及6和1。

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

下面来创建一个6面骰子和一个10面骰子,看看同时掷这两个骰子50 000次的结果如何:dice_visual.py

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

  from die import Die

  # 创建一个D6和一个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)

  # 分析结果。
  --snip--

  # 可视化结果。
  x_values = list(range(2, max_result+1))
  data = [Bar(x=x_values, y=frequencies)]

  x_axis_config = {'title': '结果', 'dtick': 1}
  y_axis_config = {'title': '结果的频率'}
❷ my_layout = Layout(title='掷一个D6和一个D10 50000次的结果',
      xaxis=x_axis_config, yaxis=y_axis_config)
  offline.plot({'data': data, 'layout': my_layout}, filename='d6_d10.html')

为创建D10,我们在创建第二个Die实例时传递了实参10(见❶);修改了第一个循环,以模拟掷骰子50 000而不是1000次;还修改了图表名称和输出文件名(见❷)。

图显示了最终的图表。可能性最大的点数不止一个,而是有5个。这是因为导致出现最小点数和最大点数的组合都只有一种(1和1以及6和10),但面数较小的骰子限制了得到中间点数的组合数:得到总点数7、8、9、10和11的组合数都是6种。因此,这些总点数是最常见的结果,它们出现的可能性相同。

在这里插入图片描述
通过使用Plotly模拟掷骰子的结果,我们能够非常自由地探索这种现象。只需几分钟,就可模拟掷各种骰子很多次。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第十九天 | 动态规划系列5,6,7,8

动态规划系列5,6,7,8 377 组合总和 Ⅳ未看解答自己编写的青春版重点代码随想录的代码我的代码(当天晚上理解后自己编写) 爬楼梯进阶322 零钱兑换未看解答自己编写的青春版写完这道题后的感受重点代码随想录的代码动态规划,也要时刻想着剪枝操作。我的代码(当天晚上理…

异常执行结果随笔

前段时间有朋友问我异常执行顺序问题,这里简单记录下哈。 伪代码描述,当j0和j1,输出结果分别是什么? int i 0; int j 0或1; try {j i / j;System.out.println(i);return i; } catch (Exception e) {System.out.pri…

win10如何使用wsl配置Ubuntu并使用vscode连接

文章目录 0. 前置资料1. 下载wsl2. 下载Ubuntu3. vscode连接wsl 0. 前置资料 wsl为适用于 Linux 的 Windows 子系统,可参考以下微软的官方文档 https://learn.microsoft.com/zh-cn/windows/wsl/ 1. 下载wsl 点击屏幕左下角的放大镜,直接在输入框键入P…

第 354 场LeetCode周赛

A 特殊元素平方和 模拟 class Solution { public:int sumOfSquares(vector<int> &nums) {int res 0;int n nums.size();for (int i 0; i < n; i)if (n % (i 1) 0)res nums[i] * nums[i];return res;} };B 数组的最大美丽值 差分数组: n u m s [ i ] nums[…

cmake处理参数时的一些问题说明

cmake处理参数时的一些问题说明 函数传参空格和分号的坑函数转发的坑demo 函数传参遇到不平衡方括号的坑 函数传参空格和分号的坑 我们在处理函数和宏的时候不过不小心会遇到很多坑例如: someCommand(a b c) someCommand(a b c)因为cmake中使用空格或者分号分隔符所以上面代…

Django实现接口自动化平台(十一)项目模块Projects序列化器及视图【持续更新中】

相关文章&#xff1a; Django实现接口自动化平台&#xff08;十&#xff09;自定义action names【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解&#xff0c;查看本章内容时&#xff0c;要结合整体项目代码来看&#xff1a; python django vue httprunner …

LangChain 本地化方案 - 使用 ChatYuan-large-v2 作为 LLM 大语言模型

一、ChatYuan-large-v2 模型 ChatYuan-large-v2是一个开源的支持中英双语的功能型对话语言大模型&#xff0c;与其他 LLM 不同的是模型十分轻量化&#xff0c;并且在轻量化的同时效果相对还不错&#xff0c;仅仅通过0.7B参数量就可以实现10B模型的基础效果&#xff0c;正是其如…

自动化测试-selenium环境搭建

文章目录 1. 什么是自动化2. 自动化测试分类3. selenium的环境搭建4. 测试selenium 1. 什么是自动化 自动化是指使用软件工具、脚本或程序来执行一系列的任务、操作或流程&#xff0c;而无需人工干预或指导。 自动化测试&#xff1a;使用自动化工具和脚本来执行测试用例&#x…

浅谈端口 | 80端口和8080端口是2个不同的端口吗?有何区别?

目录 写在前面 端口及其特点 端口号的范围和分类 在HTTP超文本传输协议中80端口有正式的身份 写在前面 首先&#xff0c;确定以及肯定的是他们俩是完全不同的端口。一般80作为网页服务器的访问端口&#xff0c;比如一个网站的ip地址是119.119.119.119&#xff0c;我们在浏…

如何将SAP数据抽取到Azure数据湖平台?

经过多年的发展&#xff0c;SNP Glue 在全球已成为值得信赖且广为人知的解决方案&#xff0c;支持客户将其 SAP 数据与现代化的平台集成。SNP Glue 打破了数据孤岛&#xff0c;向数据科学家开放了 SAP&#xff0c;支持基于企业 SAP 数据的多个新用例。 随着时间的推移&#xff…

MySQL数据库之事物

一、MySQL事务的概念 &#xff08;1&#xff09;事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么都执行&#xff0c;要么都不执行。 &#xff08…

【基础理论】描述性统计基本概念

一、说明 统计学是数学的一个分支&#xff0c;涉及数据的收集、解释、组织和解释。本博客旨在回答以下问题&#xff1a; 1. 什么是描述性统计&#xff1f;2. 描述性统计的类型&#xff1f;3. 集中趋势的度量&#xff08;平均值、中位数、模式&#xff09; 4. 散布/离差度量&…

每天一道C语言编程(6):委派任务

题目描述 某侦察队接到一项紧急任务&#xff0c;要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人&#xff0c;但有以下限制条件&#xff1a; 1)A和B两人中至少去一人&#xff1b; 2)A和D不能一起去&#xff1b; 3)A、E和F三人中要派两人去&#xff1b; 4)B和C都去或都不去…

使用CatBoost和SHAP进行多分类完整代码示例

CatBoost是顶尖的机器学习模型之一。凭借其梯度增强技术以及内置函数&#xff0c;可以在不做太多工作的情况下生成一些非常好的模型。SHAP (SHapley Additive exPlanation)是旨在解释具有独特视觉效果和性能价值的机器学习模型的输出。CatBoost和SHAP结合在一起构成了一个强大的…

《动手学深度学习》(pytorch版本)中`d2lzh_pytorch`包问题

《动手学深度学习》&#xff08;pytorch版本&#xff09;中d2lzh_pytorch包问题

vue3-03 todo-新增任务

步骤&#xff1a; todoStorage.js&#xff1a;定义获取任务列表的方法、将任务存储到localStorage的方法、后续需要用到的获取随机id的方法。useTodoList.js&#xff1a;用一个响应式变量todosRef接收任务列表的数据&#xff1b;使用watchEffect方法将新增的任务保存到localSt…

2023/7/16周报

摘要 论文阅读 1、题目和现有问题 2、工作流程 3、图神经网络模块 4、注意力网络 5、实验结果和分析 深度学习 1、GNN和GRU的融合 2、相关公式推导 总结 摘要 本周在论文阅读上&#xff0c;对基于图神经网络和改进自注意网络的会话推荐的论文进行了学习&#xff0c;…

i.MX6ULL(十六) linux 设备驱动

一 简介 Linux设备驱动是指驱动Linux内核与硬件设备进行通信的软件模块。设备驱动通常分为两类&#xff1a;字符设备驱动和块设备驱动。 设备驱动的主要功能包括&#xff1a; 设备初始化&#xff1a;在系统启动时&#xff0c;设备驱动需要初始化相应的硬件设备&#xff0c;设…

人工智能、机器学习、自然语言处理、深度学习等有啥本质的区别?

大众媒体赋予这些术语的含义通常与机器学习科学家和工程师的理解有所出入。因此&#xff0c;当我们使用这些术语时&#xff0c;给出准确的定义很重要&#xff0c;其关系韦恩图如图1.2所示。 图1.2 自然语言处理、人工智能、机器学习和深度学习等术语的关系韦恩图 1 人工智能 …

企业使用CRM后的三大提升

数字化转型是企业发展的重要决策&#xff0c;为此&#xff0c;很多企业使用CRM客户管理系统管理客户数据、优化业务流程&#xff0c;直面数字化浪潮。那么&#xff0c;使用CRM系统后&#xff0c;企业会有哪些变化呢&#xff1f; 一、提升客户体验 使用CRM系统后&#xff0c;企…