R语言多维数据可视化
知识点总览
- 多维数据基础(数据准备与标准化)
- 热图(Heatmap)
- 矩阵散点图(Scatterplot Matrix)
- 平行坐标图(Parallel Coordinates Plot)
- 本章小结
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 + 平行坐标图
数据预处理要点
- 标准化(scale):平行坐标图和热图通常需要
- 处理缺失值:na.omit() 或 插补
- 相关性检验:热图前用 cor() 计算矩阵