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

数据可视化(三)

  • 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模拟掷骰子的结果,我们能够非常自由地探索这种现象。只需几分钟,就可模拟掷各种骰子很多次。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 17 日论文合集)

文章目录 一、检测相关(5篇)1.1 TALL: Thumbnail Layout for Deepfake Video Detection1.2 Cloud Detection in Multispectral Satellite Images Using Support Vector Machines With Quantum Kernels1.3 Multimodal Motion Conditioned Diffusion Model for Skeleton-based Vi…

LiveGBS流媒体平台GB/T28181功能-海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查

海康大华宇视华为等硬件NVR摄像机注册到LiveGBS国标平台看不到设备的时候如何抓包及排查 1、设备注册后查看不到1.1、是否是自带物联网卡的摄像头1.2、关闭萤石云1.3、防火墙排查1.4、端口排查1.5、IP地址排查1.6、设备TCP/IP配置排查1.7、设备多网卡排查1.8、设备接入配置参数…

docker-compose自建RustDesk远程控制服务器

github: rustdesk/rustdesk-server: RustDesk Server Program (github.com) 一、创建 docker-compose.yml 文件,复制以下 docker-compose 配置文件内容到文件 version: 3networks:rustdesk-net:external: falseservices:hbbs:container_name: hbbspor…

卷积神经网络识别人脸项目—使用百度飞桨ai计算

卷积神经网络识别人脸项目的详细过程 整个项目需要的准备文件: 下载链接: 链接:https://pan.baidu.com/s/1WEndfi14EhVh-8Vvt62I_w 提取码:7777 链接:https://pan.baidu.com/s/10weqx3r_zbS5gNEq-xGrzg 提取码&#x…

【论文笔记】KDD2019 | KGAT: Knowledge Graph Attention Network for Recommendation

Abstract 为了更好的推荐,不仅要对user-item交互进行建模,还要将关系信息考虑进来 传统方法因子分解机将每个交互都当作一个独立的实例,但是忽略了item之间的关系(eg:一部电影的导演也是另一部电影的演员&#xff09…

idea-实现热部署

idea-实现热部署 今天在进行idea 开发时突然发现热部署失败了,每次修改内容都要去restart server一次 这样比较麻烦,故而总结一下idea实现热部署的方法: 步骤一: 选择edit configuration 然后跳出server 的配置,方框…

第一性原理COHP计算在材料科学领域的应用

第一性原理COHP计算在材料科学领域的应用 第一性原理COHP计算是一种基于密度泛函理论(DFT)的计算方法,用于研究固体材料中的化学键和电子结构相互作用。通过COHP计算,我们可以获得许多有用的数据,并且这些数据在材料科…

NFS 存储(二十八)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、概述 二、应用场景 三、安装 四、启动 五、目录结构 六、命令解析 七、配置 八、客户端访问 总结 前言 今天学习的是NFS 存储,主要是讲 nfs 的概述…

1.Lee Code HTML面试题

如何理解HTML语义化 HTML语义化是指在编写HTML代码时,使用合适的标签和元素来表达文档结构和含义,使得页面内容对搜索引擎和开发者更加友好,并增加代码的可读性。语义化的HTML使得网页在没有样式或样式加载失败时仍然能够保持良好的结构和意义。 问题 2

Kubernetes 使用 helm 部署 NFS Provisioner

文章目录 1. 介绍2. 预备条件3. 部署 nfs4. 部署 NFS subdir external provisioner4.1 集群配置 containerd 代理4.2 配置代理堡垒机通过 kubeconfig 部署 部署 MinIO添加仓库修改可配置项 访问nodepotingress 1. 介绍 NFS subdir external provisioner 使用现有且已配置的NFS…

高级ACL列表应用实验

实验拓扑图: 实验要求: PC1可以telnet R1,但不能ping R1;PC1可以ping R2但不能telnet R2;PC2和PC1相反 1、配置IP让整个网络互通 [PC1]ip route-static 0.0.0.0 0.0.0.0 192.168.1.254 [PC2]ip route-static 0.0.0.…

【VB6|第20期】遍历Excel单元格的四种方法

日期:2023年7月19日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…

Linux系统编程(信号处理机制)

文章目录 前言一、中断,异常,信号的区别二、信号在Linux中的标识三、信号处理相关函数四、代码实验总结 前言 本篇文章我们来讲解信号的处理机制,信号处理在Linux操作系统中必不可少,这一点值得大家注意,信号又会与中…

DOM事件

文章目录 1.注册事件(绑定事件)1.1 注册事件概述1.2 addEventListener 事件监听方式1.3 attachEvent 事件监听方式1.4 注册事件兼容性解决方案 2.删除事件(解绑事件)2.1 删除事件的方式2.2 删除事件兼容性解决方案 3.DOM 事件流4.…

机器学习实践(2.1)LightGBM分类任务

前言 LightGBM也属于Boosting集成学习模型(还有前面文章的XGBoost),LightGBM和XGBoost同为机器学习的集大成者。相比越来越流行的深度神经网络,LightGBM和XGBoost能更好的处理表格数据,并具有更强的可解释性,还具有易于调参、输入…

Kafka的基本概念及其关键原理

Apache Kafka是一种分布式事件存储和流处理平台。该项目旨在提供一个统一的、高吞吐量、低延迟的平台,用于处理实时数据流。 •Kafka可以通过Kafka Connect连接到外部系统(用于数据导入/导出),并提供Kafka Streams库用于流处理应用…

回溯算法组合问题之77组合

题目: 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 题目链接:77. 组合 - 力扣(LeetCode) 示例: 解法: 回溯法三部曲: &a…

简易评分系统

目录 一、实验目的 二、操作环境 三、实验内容和过程 1.实验内容 2.代码 2.1 用户验证功能 2.2 菜单函数 2.3 评分功能 四、结果分析 总体的输出结果: 保存文件成功截图: 五、小结 一、实验目的 1.巩固和提高学生学过的基础理论和专业知识&am…

55 # 实现可写流

先在 LinkedList.js 给链表添加一个移除方法 class Node {constructor(element, next) {this.element element;this.next next;} }class LinkedList {constructor() {this.head null; // 链表的头this.size 0; // 链表长度}// 可以直接在尾部添加内容,或者根据…

java贪心算法案例

1.零钱找回问题 这个问题在我们的日常生活中就更加普遍了。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?用贪心算法的思想,很显然,每一步…