R语言入门学习教程,从入门到精通,R语言多维数据可视化(12)

R语言多维数据可视化

知识点总览

  1. 多维数据基础(数据准备与标准化)
  2. 热图(Heatmap)
  3. 矩阵散点图(Scatterplot Matrix)
  4. 平行坐标图(Parallel Coordinates Plot)
  5. 本章小结

1. 多维数据基础

核心概念

  • 多维数据:每个观测包含多个数值型变量(维度)
  • 可视化目标:发现变量间的相关性、聚类模式、异常值
  • 数据预处理:标准化(归一化)使不同量纲变量可比较

核心语法

  • scale():数据标准化(均值为0,标准差为1)
  • cor():计算相关系数矩阵
r 复制代码
# 加载必要的包
library(ggplot2)      # 基础绘图
library(reshape2)     # 数据整形(melt函数)
library(GGally)       # 矩阵散点图扩展包
library(plotly)       # 交互式平行坐标图(可选)

# 创建示例多维数据集(包含5个变量,50个观测)
set.seed(123)  # 固定随机种子,保证结果可重复

# 创建基础变量(具有相关性)
temperature <- rnorm(50, mean = 20, sd = 5)           # 温度(摄氏度)
humidity <- 60 - 0.5 * temperature + rnorm(50, 0, 8)  # 湿度(%,与温度负相关)
pressure <- 1010 + 0.2 * temperature + rnorm(50, 0, 3) # 气压(hPa,与温度正相关)
wind_speed <- 5 + 0.1 * temperature + rnorm(50, 0, 2) # 风速(m/s)
rainfall <- 2 + 0.8 * humidity - 0.05 * wind_speed + rnorm(50, 0, 5) # 降雨量(mm)

# 整合为数据框
df_multidim <- data.frame(
  Temperature = temperature,
  Humidity = humidity,
  Pressure = pressure,
  WindSpeed = wind_speed,
  Rainfall = rainfall
)

# 查看数据前6行
head(df_multidim)

# 数据标准化(用于某些图表,如热图)
df_scaled <- as.data.frame(scale(df_multidim))  # scale()标准化每列

# 计算相关系数矩阵
cor_matrix <- cor(df_multidim)
print(cor_matrix)  # 显示变量间的相关性

2. 热图(Heatmap)

用途

  • 可视化矩阵数据(如相关系数矩阵)
  • 显示聚类模式(行/列相似性)
  • 识别高低值区域

核心语法

  • geom_tile():创建热图的基本几何对象
  • scale_fill_gradient2():设置颜色渐变(低-中-高值)
  • hclust() & reorder():聚类重排行/列
  • pheatmap 包:更专业的聚类热图

案例1:相关系数矩阵热图

r 复制代码
# 计算相关系数矩阵(如果前面未计算)
cor_matrix <- cor(df_multidim)
cor_df <- as.data.frame(cor_matrix)
cor_df$Var1 <- rownames(cor_df)  # 添加行名作为变量

# 将矩阵转换为长格式(适合ggplot2)
cor_melted <- melt(cor_matrix, varnames = c("Var1", "Var2"), value.name = "Correlation")

# 绘制相关系数热图
ggplot(cor_melted, aes(x = Var1, y = Var2, fill = Correlation)) +
  geom_tile(color = "white", size = 0.5) +           # 白色边框线
  scale_fill_gradient2(low = "blue",                 # 负相关为蓝色
                       mid = "white",                # 零相关为白色
                       high = "red",                 # 正相关为红色
                       midpoint = 0,                 # 中点设为0
                       limits = c(-1, 1)) +          # 相关系数范围-1到1
  geom_text(aes(label = round(Correlation, 2)),      # 显示相关系数数值
            size = 4, color = "black") +            # 字体大小和颜色
  labs(title = "变量相关系数热图",
       subtitle = "红色=正相关,蓝色=负相关",
       x = "", y = "") +                             # 隐藏轴标签
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),  # 旋转X轴标签
        axis.text = element_text(size = 10),
        plot.title = element_text(hjust = 0.5))             # 标题居中

案例2:原始数据热图(含聚类)

r 复制代码
# 使用 pheatmap 包(更专业的聚类热图)
if (!require(pheatmap)) install.packages("pheatmap")
library(pheatmap)

# 标准化后的数据矩阵
data_matrix <- as.matrix(df_scaled)  # 转换为矩阵格式

# 绘制聚类热图
pheatmap(data_matrix,
         main = "多维数据聚类热图",
         cluster_rows = TRUE,          # 对行进行聚类
         cluster_cols = TRUE,          # 对列进行聚类
         scale = "none",               # 数据已标准化,不再缩放
         color = colorRampPalette(c("blue", "white", "red"))(100),  # 颜色方案
         show_rownames = FALSE,        # 隐藏行名(数据点较多时)
         show_colnames = TRUE,         # 显示列名(变量名)
         fontsize_col = 12,            # 列标签字体大小
         border_color = "grey60",      # 边框颜色
         cellwidth = 30,               # 单元格宽度
         cellheight = 10)              # 单元格高度

3. 矩阵散点图(Scatterplot Matrix)

用途

  • 同时显示所有变量两两之间的散点图
  • 对角线通常显示变量分布(直方图/密度图)
  • 快速发现异常值、非线性关系、聚类

核心语法

  • pairs():基础R的矩阵散点图函数
  • ggpairs():ggplot2扩展(GGally包),功能更强大
  • panel.cor:自定义相关性显示函数

案例1:基础矩阵散点图(pairs函数)

r 复制代码
# 基础R的pairs函数(简单快速)
# 定义上方三角形显示相关系数的函数
panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor = 1.5) {
  # 计算相关系数并放入图形中
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0, 1, 0, 1))
  r <- abs(cor(x, y, use = "complete.obs"))
  txt <- format(c(r, 0.123456789), digits = digits)[1]
  txt <- paste0(prefix, "r = ", txt)
  text(0.5, 0.5, txt, cex = cex.cor * r)  # 字体大小与相关系数成正比
}

# 定义对角线显示密度曲线的函数
panel.hist <- function(x, ...) {
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(usr[1:2], 0, 1.5))
  h <- hist(x, plot = FALSE, breaks = 15)
  breaks <- h$breaks
  nB <- length(breaks)
  y <- h$counts
  y <- y / max(y)  # 归一化到[0,1]
  rect(breaks[-nB], 0, breaks[-1], y, col = "lightblue", border = "black")
}

# 绘制矩阵散点图
pairs(df_multidim,
      upper.panel = panel.cor,      # 上三角显示相关系数
      diag.panel = panel.hist,      # 对角线显示直方图
      lower.panel = panel.smooth,   # 下三角显示散点图+平滑线
      main = "多维数据矩阵散点图")

案例2:高级矩阵散点图(ggpairs函数)

r 复制代码
# 使用GGally包的ggpairs(功能更丰富)
library(GGally)

# 绘制增强型矩阵散点图
ggpairs(df_multidim,
        title = "增强型矩阵散点图",
        # 设置各部分的图形类型
        upper = list(continuous = wrap("cor", size = 5)),  # 上三角:相关系数
        lower = list(continuous = wrap("points",           # 下三角:散点图
                                       alpha = 0.5,        # 点透明度
                                       size = 1.5)),       # 点大小
        diag = list(continuous = wrap("densityDiag",       # 对角线:密度曲线
                                      alpha = 0.5)),       # 填充透明度
        # 颜色分组(可选,如果不分组可以注释掉)
        # aes(color = factor(rep(1:2, length.out = 50))),  # 按组着色
        ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 16))

4. 平行坐标图(Parallel Coordinates Plot)

用途

  • 可视化高维数据(维度 > 3)
  • 每条线代表一个观测,连接各变量值
  • 发现聚类模式、异常值、变量间关系

核心语法

  • ggparcoord():GGally包的平行坐标图函数
  • geom_line() + aes(group = id):手动构建
  • 需要标准化数据(消除量纲影响)

核心参数

  • columns:要绘制的变量列
  • scale:数据缩放方法("std"标准化,"globalminmax"全局缩放)
  • alphaLines:线条透明度(避免过度绘制)
  • groupColumn:按某变量分组着色

案例1:基础平行坐标图

r 复制代码
library(GGally)

# 准备数据(需要添加观测ID)
df_parallel <- df_scaled  # 使用标准化数据
df_parallel$ID <- 1:nrow(df_parallel)  # 添加观测ID

# 绘制平行坐标图
ggparcoord(data = df_parallel,
           columns = 1:5,              # 选择前5个变量(排除ID列)
           scale = "std",              # 标准化(虽然数据已标准化,但函数仍需)
           alphaLines = 0.3,          # 线条透明度(避免过度绘制)
           line.size = 0.5,           # 线条粗细
           groupColumn = NULL,        # 不分组(单色)
           showPoints = TRUE,         # 显示数据点
           pointSize = 1) +           # 点的大小
  labs(title = "平行坐标图:50个观测的多维数据",
       subtitle = "标准化后的变量(均值为0,标准差为1)",
       x = "变量名称",
       y = "标准化值") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(hjust = 0.5))

案例2:分组着色平行坐标图

r 复制代码
# 创建分组标签(例如:基于温度是否高于平均值)
df_parallel$TemperatureGroup <- ifelse(df_multidim$Temperature > 
                                        mean(df_multidim$Temperature), 
                                      "高温组", "低温组")

# 绘制分组平行坐标图
ggparcoord(data = df_parallel,
           columns = 1:5,                    # 变量列
           scale = "std",                    # 标准化
           alphaLines = 0.5,                # 透明度
           line.size = 0.6,                 # 线条粗细
           groupColumn = "TemperatureGroup", # 按温度分组着色
           showPoints = TRUE,               # 显示点
           pointSize = 1.2) +               # 点大小
  scale_color_manual(values = c("高温组" = "red", "低温组" = "blue")) +
  labs(title = "分组平行坐标图",
       subtitle = "红色=高温组,蓝色=低温组",
       x = "变量",
       y = "标准化值",
       color = "分组") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "bottom")

案例3:交互式平行坐标图(plotly)

r 复制代码
# 安装plotly包(如果未安装)
if (!require(plotly)) install.packages("plotly")
library(plotly)

# 准备数据(标准化数据)
df_plotly <- df_scaled
df_plotly$ID <- 1:nrow(df_plotly)

# 创建交互式平行坐标图
plot_ly(df_plotly,
        type = 'parcoords',          # 平行坐标图类型
        line = list(color = df_multidim$Temperature,           # 颜色映射变量
                    colorscale = 'Viridis',                    # 颜色方案
                    showscale = TRUE),                         # 显示颜色条
        dimensions = list(
          list(label = '温度', values = ~Temperature, range = c(-3, 3)),
          list(label = '湿度', values = ~Humidity, range = c(-3, 3)),
          list(label = '气压', values = ~Pressure, range = c(-3, 3)),
          list(label = '风速', values = ~WindSpeed, range = c(-3, 3)),
          list(label = '降雨量', values = ~Rainfall, range = c(-3, 3))
        )) %>%
  layout(title = "交互式平行坐标图",
         font = list(size = 10))

5. 本章小结

图表类型 适用场景 关键语法 优点 注意事项
热图 相关系数矩阵、聚类模式 geom_tile() + scale_fill_gradient2() 直观显示数值大小和聚类 需要大量数据,建议标准化
矩阵散点图 变量两两关系探索 pairs() / ggpairs() 全面展示所有变量关系 维度>10时可视性下降
平行坐标图 高维数据异常检测、聚类 ggparcoord() / plot_ly(type='parcoords') 可处理10+维度 需要标准化,线条过多可用透明度

选择建议

  • 变量数 < 5:矩阵散点图最直观
  • 关注相关性强弱:热图最合适
  • 变量数 > 10:平行坐标图更有效
  • 需要交互探索:plotly + 平行坐标图

数据预处理要点

  1. 标准化(scale):平行坐标图和热图通常需要
  2. 处理缺失值:na.omit() 或 插补
  3. 相关性检验:热图前用 cor() 计算矩阵
相关推荐
我命由我1234515 小时前
程序员的心理学学习笔记 - 空杯心态
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
stm32 菜鸟16 小时前
nucleo-f411re学习记录-13,flash的操作
学习
晓梦林16 小时前
3170靶场学习笔记
笔记·学习
ErizJ16 小时前
Redis|学习笔记
redis·笔记·学习
加油201917 小时前
方法论:如何系统性的学习?
学习·学习方法·方法论
小t说说17 小时前
科学素养培养:男孩女孩的不同“方程式”,真的有分性别学习平台?
学习
xian_wwq18 小时前
【学习笔记】变电保护、测控、安自、自动化系统概述
笔记·学习·保护
lizhihai_9918 小时前
股市学习心得—商业航天10大核心材料供应商
大数据·人工智能·学习
泰勒朗斯18 小时前
rootflight学习笔记
笔记·学习