每日掌握一个科研绘图·散点图|24-08-19

小罗碎碎念

概述

在数据分析和可视化领域,散点图是一种基础而强大的工具,用于探索两个数值变量之间的关系。

通过散点图,我们可以直观地识别出数据点之间的线性或非线性关系,发现数据中的异常值和群聚现象,以及理解变量间的相互作用。此外,散点图的交互性功能,如放大、悬停提示和数据筛选,为用户提供了深入探索数据的途径,使得分析过程更加灵活和直观。

边缘分布图作为散点图的重要补充,提供了对单个变量分布情况的洞察,包括整体分布形态、数据密度、异常值、中位数和四分位数等统计特性。这种结合使用边缘分布图的方法,增强了我们对数据全面性的理解,为数据预处理、多变量分析和统计推断提供了坚实的基础。


散点图在医学数据分析中的应用

  1. 探索变量间的关系:在医学研究中,散点图常用于探索两个连续变量之间的关系,例如在分析不同人群中健康女性的三头肌皮褶厚度与大腿围长之间的关系时,散点图能够直观展示它们之间的线性关系。通过观察数据点的分布模式,研究者可以判断变量间是否存在相关性,为进一步的统计分析提供方向。

  2. 相关性分析散点图是进行Pearson和Spearman相关性分析时不可或缺的工具。Pearson相关性分析用于衡量两个变量之间的线性关系,而Spearman相关性分析则用于衡量变量之间的单调关系,不仅限于线性。在医学数据分析中,这两种分析方法帮助研究者了解变量间的关联程度,并可用于预测和建模、数据筛选、验证假设等。

  3. 数据趋势和模式识别:在医学领域,散点图还用于识别数据的趋势和模式。例如,通过观察散点图,研究者可以发现数据的异常值、群聚现象或潜在的数据模式。在心率变异性分析中,心电散点图(Lorenz plot)能够简便、直观地显现HRV,与时域、频域指标联合使用,可以进一步提高诊断的特异性。


一、散点图

散点图是一种非常直观的图表类型,它通过在坐标系中绘制点来展示两个数值变量之间的关系。这种图表特别适用于探索数据点之间的相关性,比如是否存在线性关系、非线性关系,或者是没有明显的关系

在散点图中,每个点代表一个数据项,其X轴坐标代表数据项的第一个数值变量,而Y轴坐标代表第二个数值变量。通过观察这些点的分布,我们可以对数据的某些特性有一个初步的了解。例如,如果点大致沿着一条直线排列,这可能表明两个变量之间存在较强的线性关系。


我们可以设想这样一个场景:我们收集了1460套公寓的数据,每套公寓都有其价格和地面居住面积的信息。通过将这些数据绘制在散点图上,我们可以观察到价格与面积之间的关系。如果大多数点集中在一条从左下角到右上角的直线附近,这可能意味着公寓的价格随着面积的增加而增加。

# Libraries
# 导入所需的库
library(tidyverse) # 数据处理和可视化
library(hrbrthemes) # 提供美观的主题
library(viridisLite) # 提供颜色调色板
library(viridis) # 提供颜色调色板

# Load dataset from github
# 从GitHub加载数据集
data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/2_TwoNum.csv", header=T, sep=",") %>% dplyr::select(GrLivArea, SalePrice)
# 读取CSV文件并将其转换为数据框,然后选择GrLivArea和SalePrice两列

# plot
# 创建散点图
data %>%
  ggplot( aes(x=GrLivArea, y=SalePrice/1000)) + # 设置x轴为GrLivArea,y轴为SalePrice除以1000
    geom_point(color="#69b3a2", alpha=0.6) + # 添加散点,设置颜色和透明度
    ggtitle("Ground living area partially explains sale price of apartments") + # 设置图表标题
    theme_minimal() + # 使用最小化主题
    theme(
      plot.title = element_text(size=12) # 设置标题字体大小
    ) +
    ylab('Sale price (k$)') + # 设置y轴标签
    xlab('Ground living area') # 设置x轴标签

这段代码首先导入了所需的库,然后从GitHub加载了一个数据集,并选择了其中的GrLivArea和SalePrice两列。接着,使用ggplot2创建了一个散点图,展示了地面居住面积与公寓售价之间的关系。图表使用了最小化主题,并设置了标题、轴标签等。

image-20240819075232571

此外,散点图还可以帮助我们识别异常值或离群点。例如,如果有些点远离其他点聚集的区域,这可能意味着这些公寓的价格或面积与大多数公寓相比有显著的不同,这可能是由于地理位置、建筑质量或其他特殊因素造成的


在实际应用中,散点图可以与回归分析结合使用,通过拟合一条最佳拟合线来量化两个变量之间的关系强度和方向。例如,我们可以使用线性回归来拟合一条直线,该直线最接近所有数据点,然后通过这条线的斜率和截距来描述价格与面积之间的关系。

最后,散点图是一种非常灵活的可视化工具,可以通过添加不同的颜色、形状或大小来表示第三个变量,从而提供更丰富的信息。例如,我们可以用不同的颜色来区分不同类型的公寓,或者用点的大小来表示公寓的其他特征,如卧室数量。


目的
散点图用于研究两个变量之间的关系。因此,它通常伴随着相关系数的计算,这一系数通常试图衡量变量之间的线性关系。
然而,使用散点图可以检测到其他类型的关系,一个常见的任务是通过拟合一个模型来解释Y变量作为X变量的函数。以下是您可以通过散点图检测到的一些模式。

二、散点图在识别变量模式中的应用

2-1:概念

散点图是一种强大的数据分析工具,它不仅可以帮助我们直观地探索两个变量之间的关系,还可以揭示数据中的模式和趋势。

  1. 线性关系:如果散点图中的点大致沿着一条直线排列,这表明两个变量之间存在较强的线性关系。相关系数(如皮尔逊相关系数)可以用来量化这种线性关系的强度和方向。

  2. 非线性关系:如果点的分布显示出曲线形状,如抛物线、指数增长或对数增长等,这表明两个变量之间可能存在非线性关系。在这种情况下,可以使用非线性回归模型来拟合数据。

  3. 正相关与负相关:通过观察点的分布,我们可以确定变量之间的关系是正相关还是负相关。如果点从左下角向右上方分布,表示正相关;如果点从左上角向右下方分布,表示负相关。

  4. 无明显关系:如果散点图中的点随机分布,没有明显的模式或趋势,这可能意味着两个变量之间没有明显的线性或非线性关系。

  5. 离群点:散点图可以帮助我们识别数据中的异常值或离群点。这些点远离其他点的聚集区域,可能是由于数据录入错误、测量误差或其他特殊原因造成的。

  6. 群聚现象:如果散点图中的点在某些区域内聚集,这可能表明数据中存在某种模式或分组。这种现象可以通过聚类分析进一步研究。

  7. 多重共线性:如果一个变量的值可以被另一个变量的值很好地预测,这可能表明存在多重共线性。在这种情况下,散点图可以帮助我们识别这种关系,并在进一步的统计分析中考虑这一点。

  8. 周期性模式:在某些数据集中,散点图可能显示出周期性或季节性的变化。例如,在研究温度和能源消耗之间的关系时,我们可能会观察到随着季节变化的周期性模式。

  9. 交互作用:在涉及多个变量的情况下,散点图可以帮助我们识别变量之间的交互作用。通过观察不同变量组合的散点图,我们可以发现某些变量如何影响其他变量之间的关系。

  10. 趋势和季节性:在时间序列数据中,散点图可以用来观察长期趋势和季节性变化。通过将时间作为X轴,我们可以观察到数据点随时间的变化模式。

通过这些模式的识别,我们可以更深入地理解数据,并为进一步的统计分析和模型建立提供基础。散点图是探索性数据分析的重要工具,它可以帮助我们形成假设、发现问题并指导后续的数据分析过程。


2-2:演示

这段代码首先创建了四个数据框,分别表示无趋势、线性关系、平方关系和正弦关系的数据。然后将这四个数据框合并为一个数据框don。最后,使用ggplot2绘制了一个散点图,展示了这四种关系的数据,并根据name变量进行了分面。

# Create data
# 创建数据
d1 <- data.frame(x=seq(1,100), y=rnorm(100), name="No trend")
# 创建一个数据框d1,包含x轴序列(1到100),y轴为随机正态分布的数值,以及一个名为"No trend"的分类变量

d2 <- d1 %>% mutate(y=x*10 + rnorm(100,sd=60)) %>% mutate(name="Linear relationship")
# 创建一个数据框d2,基于d1,修改y轴为x乘以10加上随机正态分布的数值(标准差为60),并更新分类变量为"Linear relationship"

d3 <- d1 %>% mutate(y=x^2 + rnorm(100,sd=140)) %>% mutate(name="Square")
# 创建一个数据框d3,基于d1,修改y轴为x的平方加上随机正理分布的数值(标准差为140),并更新分类变量为"Square"

d4 <- data.frame( x=seq(1,10,0.1), y=sin(seq(1,10,0.1)) + rnorm(91,sd=0.6)) %>% mutate(name="Sin")
# 创建一个数据框d4,包含x轴序列(1到10,步长为0.1),y轴为正弦函数值加上随机正态分布的数值(标准差为0.6),以及一个名为"Sin"的分类变量

don <- do.call(rbind, list(d1, d2, d3, d4))
# 将d1、d2、d3和d4数据框合并为一个数据框don

# Plot
# 绘制图表
don %>%
  ggplot(aes(x=x, y=y)) + # 设置x轴为x,y轴为y
    geom_point(color="#69b3a2", alpha=0.8) + # 添加散点图,设置颜色和透明度
    theme_minimal() + # 使用最小化主题
    facet_wrap(~name, scale="free") # 根据name变量进行分面,并允许每个子图的尺度自由调整

image-20240819075837888


三、交互式散点图

3-1:概念

交互性是现代数据分析和可视化中不可或缺的一部分,特别是在使用散点图时。

以下是交互性如何增强散点图功能的一些方式:

  1. 放大功能:用户可以通过放大工具来放大散点图的特定区域,这使得观察者能够更细致地查看数据点的局部模式和趋势。这种放大可以是整体的,也可以是针对图表的特定部分,以便深入分析。

  2. 悬停信息:当用户将鼠标悬停在散点图上的某个点时,通常会显示一个提示框或信息框,显示该点的详细信息,如具体的X和Y坐标值、相关的数据标签或其他元数据。这种即时反馈帮助用户快速理解每个数据点的上下文。

  3. 工具提示定制:在某些高级的可视化工具中,用户可以定制工具提示的内容,选择显示哪些数据字段,甚至可以格式化显示的数据,如货币格式、百分比等。

  4. 数据筛选:交互式散点图通常允许用户通过点击图例或使用控制面板来筛选数据。这样,用户可以仅查看符合特定条件的数据点,从而更容易地识别特定子集的模式。

  5. 动态更新:在交互式环境中,当用户调整图表参数或筛选条件时,散点图可以动态更新,实时反映用户的操作,提供即时的视觉反馈。

  6. 多维度探索:通过交互式散点图,用户可以探索数据的多个维度。例如,通过改变颜色或形状来表示第三个或第四个变量,用户可以在同一个图表中分析多个变量之间的关系。

  7. 链接和刷选:在更复杂的数据可视化系统中,散点图可以与其他图表类型链接,允许用户在散点图中选择某些点,然后在其他图表中查看这些点的相关信息。

  8. 交互式回归线:在某些散点图中,用户可以添加或调整回归线,以更好地理解变量之间的线性关系。用户可以通过拖动回归线来观察其对相关系数和拟合优度的影响。

  9. 自定义视图保存:用户可以保存他们通过交互操作得到的特定视图或分析结果,以便日后复查或与他人分享。

  10. 交互式教程和帮助:为了帮助用户充分利用交互式散点图的功能,许多工具提供了交互式教程或帮助系统,指导用户如何使用各种交互功能。

通过这些交互性功能,散点图不仅仅是一个静态的图表,而是一个动态的探索工具,允许用户深入挖掘数据,发现隐藏的模式和趋势,并与数据进行更深层次的互动。这种交互性极大地增强了数据分析的灵活性和深度,使得用户能够更加自信地做出基于数据的决策。


3-2:演示

这段代码首先导入了plotly库,然后将原始数据集中的GrLivArea和SalePrice两列绘制为一个散点图,并添加了标题、主题和轴标签。接着,使用mutate函数创建了一个新列text,包含有关公寓的信息。最后,使用ggplotly函数将ggplot2图形转换为交互式Plotly图形,并设置悬停提示为text列的信息。

# Plotly allows to turn any ggplot2 graphic interactive
# Plotly库可以将任何ggplot2图形转换为交互式图形
library(plotly)

# 创建一个新列text,包含有关公寓的信息
p <- data %>%
  mutate(text=paste("Apartment Number: ", seq(1:nrow(data)), "
Location: New York
Any other information you need..", sep="")) %>%
  ggplot( aes(x=GrLivArea, y=SalePrice/1000, text=text)) + # 设置x轴为GrLivArea,y轴为SalePrice除以1000,文本信息为text
    geom_point(color="#69b3a2", alpha=0.8) + # 添加散点图,设置颜色和透明度
    ggtitle("Ground living area partially explains sale price of apartments") + # 设置图表标题
    theme_ipsum() + # 使用ipsum主题
    theme(
      plot.title = element_text(size=12) # 设置标题字体大小
    ) +
    ylab('Sale price (k$)') + # 设置y轴标签
    xlab('Ground living area') # 设置x轴标签

# 将ggplot2图形转换为交互式Plotly图形,并设置悬停提示为text列的信息
ggplotly(p, tooltip="text")

image-20240819080232107


四、边缘分布图与散点图的结合

4-1:概念

边缘分布图,也称为边缘直方图或边缘箱线图,是散点图的一个重要补充,它提供了对单个变量分布情况的额外视角。

以下是边缘分布图如何增强散点图洞察力的一些方式:

  1. 整体分布情况:边缘分布图可以展示每个变量的边缘分布,即不考虑另一个变量的情况下,该变量的分布情况。这有助于观察者理解每个变量的中心趋势、离散程度和潜在的偏态。

  2. 数据密度:边缘分布图可以揭示数据点的密度,即在特定范围内数据点的集中程度。这有助于识别数据的高峰区域和稀疏区域。

  3. 异常值检测:通过边缘分布图,可以更容易地发现异常值或离群点,因为它们会在分布图中显得格外突出。

  4. 分布形态:边缘分布图可以展示数据的形态,如对称分布、偏态分布或多峰分布。这有助于理解数据的特性和潜在的非正态分布问题。

  5. 数据范围:边缘分布图可以清晰地展示数据的范围,包括最小值、最大值以及数据的跨度。

  6. 中位数和四分位数:在箱线图中,中位数和四分位数的位置可以直观地展示数据的中心和分散情况,有助于快速把握数据的统计特性。

  7. 辅助回归分析:边缘分布图可以辅助回归分析,通过观察X和Y变量的分布,可以更好地理解回归模型的适用性和可能的偏差。

  8. 数据预处理:边缘分布图可以指导数据预处理,如数据转换、标准化或归一化,以适应特定的分析方法。

  9. 多变量分析:在涉及多个变量的情况下,边缘分布图可以展示每个变量与其他变量的关系,为多变量分析提供基础。

  10. 交互式探索:在交互式可视化工具中,边缘分布图可以与散点图同步更新,允许用户在调整散点图参数时,同时观察边缘分布的变化。

  11. 增强可视化效果:边缘分布图可以增强散点图的视觉效果,提供更全面的数据视角,使图表更加丰富和信息密集。

  12. 统计推断:边缘分布图可以作为统计推断的起点,帮助用户对数据的分布特性进行假设检验或构建概率模型。

通过结合散点图和边缘分布图,数据分析师可以更全面地理解数据的特性和变量之间的关系,从而做出更加准确和有根据的分析和决策。这种综合的可视化方法提高了数据解释的深度和广度,是现代数据分析中的重要工具。


4-2:演示

这段代码首先导入了ggExtra库,然后创建了一个散点图,展示了GrLivArea和SalePrice之间的关系。接着,使用ggExtra库的ggMarginal函数在散点图周围添加了边际直方图,以便更好地观察数据的分布情况。

library(ggExtra) # 导入ggExtra库,用于添加边际直方图

# create a ggplot2 scatterplot
# 创建一个ggplot2散点图
p <- data %>%
  ggplot( aes(x=GrLivArea, y=SalePrice/1000)) + # 设置x轴为GrLivArea,y轴为SalePrice除以1000
  geom_point(color="#69b3a2", alpha=0.8) + # 添加散点图,设置颜色和透明度
  theme_minimal() + # 使用最小化主题
  theme(
    legend.position="none" # 不显示图例
  )

# add marginal histograms
# 在散点图周围添加边际直方图
ggExtra::ggMarginal(p, type = "histogram", color="grey") # 使用ggExtra库的ggMarginal函数,设置类型为直方图,颜色为灰色

image-20240819081020856

要在Python中使用散点图进行曲线拟合,可以使用SciPy库中的curve_fit函数。首先,我们需要导入所需的库和数据: ```python import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit # 定义我们要拟合的函数 def func(x, a, b, c): return a * np.sin(b * x) + c # 假设我们有一些数据 x_data = np.linspace(0, 2 * np.pi, 50) y_data = 2.5 * np.sin(1.5 * x_data) + 1.5 + np.random.normal(size=50) ``` 在这里,我们定义了一个名为func的函数,它将被用作我们要拟合的函数。我们还创建了一些假数据,其中x_data是介于0到2π之间的50个等间距数据点,y_data是根据这些x值计算出来的一些带有噪声的y值。 接下来,我们使用curve_fit函数进行拟合: ```python # 使用curve_fit进行拟合 popt, pcov = curve_fit(func, x_data, y_data) # 输出拟合的参数 print(popt) # 绘制原始数据和拟合的曲线 plt.scatter(x_data, y_data) plt.plot(x_data, func(x_data, *popt), 'r') plt.show() ``` 这里的curve_fit函数将我们的数据和func函数作为输入,并返回一个包含拟合参数的数组popt和一个协方差矩阵pcov。我们可以使用popt来绘制拟合的曲线。 最后,我们可以使用Matplotlib库来绘制散点图和拟合的曲线。在这里,我们首先使用plt.scatter函数绘制原始数据的散点图,然后使用plt.plot函数绘制拟合曲线。 运行完整的代码,你将会得到一个包含原始数据和拟合曲线的散点图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值