每日掌握一个科研插图·2D密度图|24-08-21

news2024/11/25 10:58:38

小罗碎碎念

在统计学和数据可视化领域,探索两个定量变量之间的关系是一种常见的需求。为了更深入地理解这种关系,我们可以使用多种图形表示方法,这些方法在本质上是对传统图形的扩展和变体。

  1. 散点图:这是最基本的图形,用于展示两个变量之间的关系。在散点图中,每个数据点在X轴和Y轴上的坐标分别对应两个变量的值。通过观察数据点的分布,我们可以初步了解变量之间的相关性。

  2. 六边形分箱图(Hexbin Plot):这种图形使用六边形的格子来代替传统的矩形格子。每个六边形区域内的数据点数量通过颜色的深浅来表示,从而提供了一种更平滑的视觉效果。六边形分箱图特别适合于展示数据的局部密度,因为它可以减少边界效应。

  3. 二维直方图(2D Histogram):与一维直方图类似,二维直方图通过在X轴和Y轴上划分区间,计算每个小矩形区域内的数据点数量。这种图形可以直观地展示数据在不同区间的分布情况,但可能会因为边界效应而产生误导。

  4. 二维密度图(2D Density Plot):这种图形通过计算数据点的局部密度来展示变量之间的关系。与直方图不同,密度图使用平滑的曲线来表示数据点的分布,从而提供了更连续的视觉效果。

  5. 核密度估计(Kernel Density Estimation, KDE):这是一种非参数方法,用于估计数据的概率密度函数。在二维空间中,KDE可以生成一个平滑的曲面,展示两个变量的联合分布。这种方法不依赖于事先定义的区间,因此可以更灵活地适应数据的分布。

  6. 等高线图(Contour Plot):等高线图通过连接具有相同密度估计值的点来形成等值线。这种图形可以清晰地展示数据的局部模式和趋势,尤其是在数据点分布不均匀的情况下。

  7. 热力图(Heatmap):热力图是一种颜色编码的矩阵,通常用于展示两个分类变量之间的关系。在二维空间中,热力图可以扩展为展示两个定量变量的联合分布,其中颜色的深浅代表数据点的密度。

  8. 散点图矩阵(Scatterplot Matrix):这是一种将多个散点图组合在一起的图形,用于同时探索多个变量之间的关系。每个散点图都代表两个变量之间的配对关系,而矩阵的对角线上可以放置直方图或箱线图来展示单个变量的分布。

通过这些图形的组合和变体,我们可以从不同角度和层面上分析和理解数据,从而获得更深入的洞察。每种图形都有其独特的优势和局限性,因此在实际应用中需要根据数据的特点和分析的目的来选择合适的图形表示方法。


一、图形展示

这段代码主要展示了如何使用Python的matplotlib和scipy库来绘制二维数据的散点图、六边形图、二维直方图以及高斯核密度估计(Gaussian KDE)的密度图和等高线图。

# 导入所需的库
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde as kde

# 创建数据:200个二维正态分布的点
data = np.random.multivariate_normal([0, 0], [[1, 0.5], [0.5, 3]], 200)
x, y = data.T  # 将数据转置,方便后续处理

# 创建一个包含6个子图的图形
fig, axes = plt.subplots(ncols=6, nrows=1, figsize=(21, 5))

# 绘制散点图
axes[0].set_title('Scatterplot')
axes[0].plot(x, y, 'ko')

# 绘制六边形图
nbins = 20
axes[1].set_title('Hexbin')
axes[1].hexbin(x, y, gridsize=nbins, cmap=plt.cm.BuGn_r)

# 绘制二维直方图
axes[2].set_title('2D Histogram')
axes[2].hist2d(x, y, bins=nbins, cmap=plt.cm.BuGn_r)

# 计算高斯核密度估计
k = kde(data.T)
xi, yi = np.mgrid[x.min():x.max():nbins*1j, y.min():y.max():nbins*1j]
zi = k(np.vstack([xi.flatten(), yi.flatten()]))

# 绘制高斯核密度估计的密度图
axes[3].set_title('Calculate Gaussian KDE')
axes[3].pcolormesh(xi, yi, zi.reshape(xi.shape), cmap=plt.cm.BuGn_r)

# 绘制带有阴影的高斯核密度估计的密度图
axes[4].set_title('2D Density with shading')
axes[4].pcolormesh(xi, yi, zi.reshape(xi.shape), shading='gouraud', cmap=plt.cm.BuGn_r)

# 绘制高斯核密度估计的等高线图
axes[5].set_title('Contour')
axes[5].pcolormesh(xi, yi, zi.reshape(xi.shape), shading='gouraud', cmap=plt.cm.BuGn_r)
axes[5].contour(xi, yi, zi.reshape(xi.shape))

这段代码首先创建了一个包含200个二维正态分布点的数组,然后使用matplotlib库绘制了散点图、六边形图和二维直方图。接下来,使用scipy库中的高斯核密度估计函数计算数据的密度,并将结果绘制为密度图和等高线图。这些图表可以帮助我们更好地理解数据的分布和密度。

image-20240821113155734


二、二维分布图

二维分布图是一种强大的工具,它可以帮助我们更清晰地理解两个变量之间的关系,尤其是在数据点数量众多且存在大量重叠时。

2-1:散点图的局限性

在传统的散点图中,当两个变量之间存在强相关性或者数据点非常密集时,许多点可能会重叠在一起,形成一个密集的簇。

这会导致视觉上的混淆,使得我们难以分辨个别数据点,也难以识别数据中的模式或趋势。

例如,如果两个变量之间存在线性关系,但是数据点过于集中,我们可能无法直观地看到这个关系。


2-2:二维分布图的优势

二维分布图通过使用颜色梯度或者等高线来表示数据点的密度,从而有效地解决了散点图中的重叠问题。

以下是一些二维分布图的优势:

  1. 数据点密度的可视化:通过颜色的深浅或者等高线的密集程度,我们可以直观地看到数据点在不同区域的分布密度。

  2. 模式和趋势的揭示:在二维分布图中,即使数据点非常密集,我们也能够通过颜色的变化或者等高线的分布来识别出潜在的模式和趋势。

  3. 边界效应的减少:与二维直方图相比,二维密度图使用平滑的核函数来估计数据点的密度,从而减少了边界效应,提供了更平滑的视觉效果。

  4. 多尺度分析:二维分布图可以同时展示宏观和微观层面的数据特征,帮助我们理解数据的整体结构和局部细节。


2-3:示例:重叠散点图与二维密度图的比较

假设我们有一个包含数千个数据点的数据集,这些数据点在散点图上高度重叠,使得我们难以识别任何模式。当我们将这些数据点转换为二维密度图时,情况会有很大的不同:

  • 重叠散点图:数据点密集地聚集在一起,形成了一个几乎无法区分个别点的黑色或深色区域。这种图很难提供有用的信息。

  • 二维密度图:通过颜色梯度,我们可以看到数据点的分布呈现出某种模式。例如,如果数据点在某些区域的密度明显高于其他区域,这可能表明两个变量之间存在某种非线性关系或者交互效应。


2-4:隐藏模式的显现

在二维密度图中,原本在散点图中被隐藏的模式可能会变得非常明显。例如:

  • 聚类:如果数据点在某些区域形成了高密度的簇,这可能表明存在某些未观察到的分组或类别。

  • 非线性关系:如果数据点的密度呈现出某种曲线或者非线性模式,这可能揭示了两个变量之间的复杂关系。

  • 异常值:在某些情况下,二维密度图可以帮助我们识别出异常值或者离群点,这些在散点图中可能不容易被发现。


2-5:代码演示

二维分布图在避免散点图中数据点重叠方面非常有用。以下是一个示例,展示了重叠散点图与二维密度图之间的区别。在第二种情况下,一个非常明显的隐藏模式显现出来:

# 导入所需的库
library(tidyverse)  # tidyverse包提供了数据整理和图形制作的工具
library(hrbrthemes)  # hrbrthemes包提供了一些美观的主题
library(viridis)  # viridis包提供了一系列颜色渐变方案
library(patchwork)  # patchwork包允许你组合多个图形

# 创建数据集
a <- data.frame( x=rnorm(20000, 10, 1.2), y=rnorm(20000, 10, 1.2), group=rep("A",20000))
b <- data.frame( x=rnorm(20000, 14.5, 1.2), y=rnorm(20000, 14.5, 1.2), group=rep("B",20000))
c <- data.frame( x=rnorm(20000, 9.5, 1.5), y=rnorm(20000, 15.5, 1.5), group=rep("C",20000))
data <- do.call(rbind, list(a,b,c))  # 将三个数据框合并为一个

# 创建第一个图形p1:散点图
p1 <- data %>%
  ggplot( aes(x=x, y=y)) +  # 使用ggplot2语法创建图形,并指定x和y变量
    geom_point(color="#69b3a2", size=2) +  # 添加散点图层,设置颜色和大小
    theme_minimal() +  # 使用最小化主题
    theme(
      legend.position="none"  # 移除图例
    )

# 创建第二个图形p2:二维密度图
p2 <- ggplot(data, aes(x=x, y=y) ) +
  stat_density_2d(aes(fill = ..density..), geom = "raster", contour = FALSE) +  # 计算二维密度并添加到图形中
  scale_x_continuous(expand = c(0, 0)) +  # 设置x轴的范围和扩展
  scale_y_continuous(expand = c(0, 0)) +  # 设置y轴的范围和扩展
  scale_fill_viridis() +  # 使用viridis颜色渐变方案
  theme(
    legend.position='none'  # 移除图例
  )

# 将p1和p2组合成一个图形
p1 + p2

这段代码首先创建了一个包含60000个数据点的数据集,其中每个数据点都有x和y坐标以及一个分组标签(A、B或C)。然后,它创建了两个图形:一个是散点图(p1),显示了所有数据点的位置;另一个是二维密度图(p2),显示了数据点在二维空间中的分布密度。最后,使用patchwork包将这两个图形组合成一个复合图形。

image-20240821114031489


三、变体

在数据可视化领域,二维分布图的三维表现形式确实是一种在特定情况下非常有用的工具。通过将传统的散点图信息转换为三维表面图,我们可以更直观地观察数据点在三维空间中的分布情况。

3-1:三维表面图的构建

首先,我们可以将数据点分布在一个网格上,这个网格可以由六边形或正方形组成,类似于二维直方图或六边形分箱图。

接着,不是简单地通过颜色渐变来表示数据点的密度,而是通过计算每个网格单元内的数据点数量,将其转换为三维空间中的一个高度值

这样,每个网格单元的密度就通过其在Z轴上的高度来表示,形成了一个三维表面 。


3-2:群组的识别

通过这种三维表面图,我们可以更容易地识别数据中的群组。

例如,如果数据中存在三个不同的群组,它们可能会在三维表面图中形成三个明显的高峰

这些高峰在视觉上非常突出,使得我们能够快速地识别出数据的聚类结构 。


3-3:数据的深度洞察

三维表面图不仅帮助我们识别群组,还可以提供对数据分布深度的洞察。

通过观察不同高度的表面,我们可以了解每个群组的密度和大小,甚至可以分析群组之间的相对位置和可能的关联 。


3-4:交互性和动态性

现代的数据可视化工具,如Echarts,允许用户与三维散点分布图进行交互,例如通过旋转、缩放来从不同角度观察数据。

这种交互性极大地增强了我们对数据的理解,并使得复杂的数据集更加易于探索和分析 。


3-5:代码演示

# 导入所需的库
library(plotly)  # plotly库用于创建交互式图形
library(MASS)     # MASS库包含了kde2d函数,用于计算二维核密度估计

# 假设data是一个已经存在的数据框,其中包含x和y两列数据
# 计算二维核密度估计
kd <- with(data, MASS::kde2d(x, y, n = 50))

# 使用plotly绘制三维曲面图
plot_ly(x = kd$x, y = kd$y, z = kd$z) %>% add_surface()

这段代码使用了R语言的plotly和MASS库来计算二维数据的核密度估计(KDE)并绘制三维曲面图。

image-20240821114447900

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

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

相关文章

什么是 JavaConfig?

什么是 JavaConfig&#xff1f; &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; JavaConfig是Spring框架的一项创新&#xff0c;它允许开发者使用纯Java代码来配置Spring IoC容器&#xff0c;从而避免了繁琐的XML配置。这一特性带来了诸多优…

【微信小程序】导入项目

1.在微信开发工具中&#xff0c;点击【导入项目】 2.在打开的界面中执行2个步骤 1.找到要导入项目的路径2.AppID要改成自己的AppID 3.package.json包初始化【装包之前要确保有package.json文件】 1.在【资源管理器】空白处&#xff0c;点击鼠标右键&#xff0c;选择【】&am…

免费的真是太香了!Chainlit接入抖音 Coze AI知识库接口快速实现自定义用户聊天界面

前言 由于Coze 只提供了一个分享用的网页应用&#xff0c;网页访问地址没法自定义&#xff0c;虽然可以接入NextWeb/ChatGPT web/open webui等开源应用。但是如果我们想直接给客户应用&#xff0c;还需要客户去设置配置&#xff0c;里面还有很多我们不想展示给客户的东西怎么办…

[Python可视化]空气污染物浓度地图可视化

[Python可视化]空气污染物浓度地图可视化&#xff0c;果然是路边浓度最大 在本篇文章中&#xff0c;我将展示如何使用 Python 结合 OSMnx、NetworkX 和 GeoPandas 等库&#xff0c;计算给定路径的最短路线&#xff0c;并基于该路径穿过的网格单元计算总污染量。最终&#xff0c…

uniapp 修复使用 uni.saveImageToPhotosAlbum 方法在部分安卓手机上保存失败

场景&#xff1a;使用 uni.saveImageToPhotosAlbum 保存图片&#xff0c;其他手机都是可以的&#xff0c;但在鸿蒙系统的手机上出现了bug&#xff0c;报错Object {errMsg:"savelmageToPhotosAlbum:fai..errMsg:savelmageToPhotosAlbum:fail invalid filetype"} 原因&…

数学建模学习(116):全面解析梯度下降算法及其在机器学习中的应用与优化

文章目录 1.梯度下降简介1.1 梯度下降的数学原理1.2 学习率的选择2 梯度下降变体3.梯度下降优化器3.1 动量法(Momentum)3.2 AdaGrad3.3 RMSprop3.4 Adam3.5 Python 使用不同优化器训练线性回归模型4.案例:使用梯度下降优化加利福尼亚房价预测模型4.1. 数据准备4.2. 模型训练…

【dotnet】Ubuntu 24.04安装dotnet 8.0报错

我的环境是Ubuntu 24.04&#xff0c;64位&#xff0c;使用azure的虚拟机。 报错文字如下&#xff1a; kidfuazurefu:~$ sudo apt install dotnet-sdk-8.0 Reading package lists... Done Building dependency tree... Done Reading state information... Done Some packages c…

数学生物学-3-固定点、稳定性和蛛网图(Fixed Points, Stability, and Cobwebbing)

在前一篇博客中&#xff0c;我们研究了一些离散时间模型的例子。特别是&#xff0c;我们推导出了离散逻辑方程的重要例子。 数学生物学-2-离散时间模型(Discrete Time Models&#xff09;-CSDN博客 在本篇文章中&#xff0c;我们将考虑离散时间模型的一般形式&#xff08;在数…

超声波水表是什么?量程比又是什么?

一、超声波水表概述 1.定义&#xff1a; 超声波水表是一种利用超声波技术来测量水流速度&#xff0c;进而计算出流经管道的水体积流量的计量设备。它通过发送和接收超声波信号的时间差来确定水流的速度&#xff0c;从而精确地计量水的流量。 2.工作原理&#xff1a; 超声波…

勇闯计算机视觉(第一关--环境激活)

以下内容&#xff0c;皆为原创&#xff0c;制作实属不易&#xff0c;多谢帅锅和镁铝观看和关注。 一.什么是计算机视觉 计算机视觉是人工智能的一个分支&#xff0c;它使计算机能够从图像或多维数据中解释和理解视觉信息。计算机视觉的目标是模拟人类视觉系统的能力&#xff0c…

普元EOS-数据实体运行时动态增加property

1 前言 在Java开发读取数据的时候&#xff0c;一般都采用ORM方式将数据表的字段映射到实体对象中。 数据表中有一个字段&#xff0c;实体对象就有一个字段。 但很多时候&#xff0c;我们在读取的数据和显示的数据不同&#xff0c;比如&#xff0c;读取的是部门id&#xff0c…

java多线程(七)AQS(AbstractQueuedSynchronizer)技术解析:以赛跑起跑场景为例

AQS概括 核心思想 AQS&#xff08;AbstractQueuedSynchronizer&#xff09;是Java并发包中的一个核心同步器框架&#xff0c;它定义了一套多线程访问共享资源的同步机制。 其核心思想是&#xff1a;利用一个volatile的int类型的变量state来表示同步状态&#xff0c;并通过一…

微信自动回复,周末也能轻松应对!

相信很多人都有过这样的经历&#xff1a;休息的时候&#xff0c;手机响个不停&#xff0c;生怕漏掉一个客户消息&#xff0c;结果一不小心就让客户流失了&#xff01; 要想解决这个问题&#xff0c;你只需一个多微管理系统&#xff0c;让我们一起来看看它的自动回复设置吧&…

这个方法完美解决我的Jenkins插件不能下载安装的问题

1、打开这个地址&#xff08;前提是jenkins是开启的哦&#xff09;http://localhost:8080/pluginManager/advanced 。 2、在最下面update site 改成http://updates.jenkins.io/update-center.json 。 3、服务列表中关闭jenkins&#xff0c;再重新启动&#xff0c;就能联网下载了…

叉车AI行车防撞监控系统方案,二级报警区域,守护人与车的安全!

九盾叉车AI行车防撞监控系统安装在叉车驾驶室顶的前后单独安装ADAS摄像头&#xff0c;结合深度学习算法以完成机器视觉的识别工作&#xff0c;分别安装在车辆护顶架前后方&#xff0c;进行180二级区域视频监控&#xff0c;同时解决二个方向维度的视野盲区&#xff0c;可根据距离…

数据结构(6.2_4)——图的基本操作

注&#xff1a;只探讨邻接矩阵和邻接表怎么实现图的基本操作 Adjacent(G,x,y):判断图G是否存在边<x,y>或(x,y) 领接矩阵 邻接表 有向图&#xff1a; Neighbors(G,x):列出图G中与结点x邻接的边 有向图 InsertVertex(G,x):在图G中插入顶点x DeleteVertex(G,x):在图G中删除…

【蓝桥杯集训100题】scratch时间计算 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第26题

目录 scratch时间计算 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 scratc…

125-隧道技术SMBICMP正反向连接防火墙出入规则上线

参考&#xff1a;【内网安全】 隧道技术&SMB&ICMP&正反向连接&防火墙出入规则上线_第125天:内网安全-隧道技术&smb&icmp&正反向连接&防火墙出入规则上线-CSDN博客 怎么知道对方是出站限制还是入站限制呢&#xff1f; 上传正向和反向木马进行测…

面试准备算法

用最少数量的箭引爆气球 class Solution { public:class MyCompare{public:bool operator()(vector<int>& a, vector<int>& b){return a[0] < b[0];}};int findMinArrowShots(vector<vector<int>>& points) {int count 1;MyCompare c…

啥是粘包和半包,咋解决?

写在前面 本文看下半包和粘包。 1&#xff1a;什么是半包和粘包&#xff0c;以及如何解决 因为网络传输数据都是一个数据包一个数据包传输的&#xff0c;就像这样&#xff1a; 在读取这些数据包时如果读到了数据包A的一部分就是半包。如果是读到了数据包A和数据包B&#xf…