如何在ggbiplot生成的PCA图中为特定点添加圆圈
问题原因
ggbiplot内部会将PCA结果转换为包含xvar(对应PC1)、yvar(对应PC2)及分组信息的专属数据集,你直接调用原始iris数据添加geom_point时,原始数据中没有这些ggbiplot生成的美学变量,因此触发报错。
解决方案
方案1:提取ggbiplot的绘图数据后筛选修改
先获取ggbiplot实际使用的数据集,再基于该数据集筛选目标分组添加自定义样式:
# 加载所需包 library(ggplot2) library(ggbiplot) # 加载数据并执行PCA data(iris) pca <- prcomp(iris[, 1:4], scale. = TRUE) class <- iris$Species # 生成ggbiplot对象并提取其绘图数据 pca_plot <- ggbiplot(pca, obs.scale = 1, var.scale = 1, groups = class, circle = FALSE) plot_data <- pca_plot$data # 绘制PCA图并添加自定义点样式 pca_plot + geom_point(size = 3, aes(color = class)) + # 为setosa组添加空心圆圈 geom_point(data = subset(plot_data, groups == "setosa"), pch = 21, fill = NA, size = 5, colour = "black", stroke = 2)
方案2:通过条件映射直接设置样式
无需额外提取数据,直接在geom_point的美学映射中通过条件判断区分目标分组:
library(ggplot2) library(ggbiplot) data(iris) pca <- prcomp(iris[, 1:4], scale. = TRUE) class <- iris$Species ggbiplot(pca, obs.scale = 1, var.scale = 1, groups = class, circle = FALSE) + geom_point(aes( size = ifelse(groups == "setosa", 5, 3), shape = ifelse(groups == "setosa", 21, 19), color = ifelse(groups == "setosa", "black", class) ), fill = NA, stroke = 2) + # 关闭自动图例(避免样式参数生成冗余图例) scale_size_identity() + scale_shape_identity()
内容的提问来源于stack exchange,提问作者Charitè Learner
相关产品推荐
相关产品推荐

