You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:37:19