在ggplot2/ggfortify中为PCA图配置多组连续调色板及自定义标签颜色
R语言PCA可视化问题解决方法
问题1:给col2每个组配独立的连续调色板
要实现同形状(col2)组内用统一色系的连续色,不同形状用不同色系,直接分层绘图或者用ggnewscale包都能搞定。
方法1:分层绘制(无需额外包)
拆出col2的每个组,分别添加图层,为每个图层指定对应色系的渐变:
library(ggplot2) library(ggfortify) library(colorspace) # 用来生成平滑连续色系,也可手动写颜色向量 # 初始化绘图,先不设置颜色和形状 df.pca.plot <- autoplot(df.pca, data = df, colour = NA, shape = NA) + # 第一个col2组(比如"Triangle")用紫色系 geom_point(data = subset(df, col2 == "Triangle"), aes(x = PC1, y = PC2, colour = col1, shape = col2)) + scale_colour_gradientn(colours = sequential_hcl(10, palette = "Purple")) + # 第二个col2组(比如"Diamond")用橙色系 geom_point(data = subset(df, col2 == "Diamond"), aes(x = PC1, y = PC2, colour = col1, shape = col2)) + scale_colour_gradientn(colours = sequential_hcl(10, palette = "Orange")) + # 第三个col2组(比如"Circle")用绿色系 geom_point(data = subset(df, col2 == "Circle"), aes(x = PC1, y = PC2, colour = col1, shape = col2)) + scale_colour_gradientn(colours = sequential_hcl(10, palette = "Green")) + # 保留形状的默认映射 scale_shape_discrete() + theme_bw()
不想用colorspace的话,直接写颜色向量也行,比如colours = c("#f8e7f2", "#a851a1", "#5a1e5c")。
方法2:用ggnewscale简化代码
如果分组多,分层太繁琐,用ggnewscale可以快速添加多个颜色比例尺:
library(ggnewscale) df.pca.plot <- autoplot(df.pca, data = df, shape = 'col2') + # 第一个组的颜色映射 geom_point(data = subset(df, col2 == "Triangle"), aes(colour = col1)) + scale_colour_gradientn(colours = sequential_hcl(10, "Purple")) + new_scale_colour() + # 开启新的颜色比例尺,不影响之前的设置 # 第二个组的颜色映射 geom_point(data = subset(df, col2 == "Diamond"), aes(colour = col1)) + scale_colour_gradientn(colours = sequential_hcl(10, "Orange")) + new_scale_colour() + # 第三个组的颜色映射 geom_point(data = subset(df, col2 == "Circle"), aes(colour = col1)) + scale_colour_gradientn(colours = sequential_hcl(10, "Green")) + theme_bw()
问题2:自定义col2组的标签颜色
你之前的问题是fviz_pca_ind已经用col.ind绑定了col1的颜色映射,后续标签颜色会和这个映射冲突,用ggnewscale添加新的颜色比例尺就能解决:
library(ggnewscale) library(factoextra) library(ggplot2) fviz_pca_ind(df.pca, col.ind = col1, # 点的颜色用col1的调色板 geom="point", palette = paletteer_c("grDevices::rainbow", 26), addEllipses = TRUE, ellipse.type = "confidence", repel = TRUE) + new_scale_colour() + # 新建颜色映射上下文,和点的颜色分开 geom_text_repel(aes(label=rownames(df), colour=col2), data = df, # 明确指定数据,避免语法问题 show.legend=FALSE) + # 自定义col2每个组的标签颜色,替换成你实际的分组名和颜色 scale_colour_manual(values = c("Group1" = "#ff3333", "Group2" = "#3366ff", "Group3" = "#33cc33"))
记得把代码里的Group1/Group2/Group3换成你col2里实际的分组名称,颜色也可以改成你喜欢的十六进制色或颜色名。
内容的提问来源于stack exchange,提问作者NinaShch
相关产品推荐
相关产品推荐

