还在用 PPT 或者 AI 给图画圈圈吗?最近发现这些事情可以用 ggalt 来做,几行代码,解决自己画半天还不满意的情况,可谓是省时省力。

举个实际应用的例子,PCA的结果展示中经常需要将某一类群圈起来,当然不止是这种情况,凡是需要画圈圈的 ggalt 都是可以做的,话不多说直接上代码(主要采用参考资料1中的代码,本文做了一些修改和说明)。

## 安装 ggalt

BiocManager::install("ggalt")

## 加载包

rm(list = ls())
library(ggplot2)
library(ggalt)
library(ggfortify)
library(patchwork)
theme_set(theme_classic())

## 对iris数据集进行PCA,并获得PC坐标,完成数据的准备

df <- iris[c(1, 2, 3, 4)]
pca_mod <- prcomp(df)  
df_pc <- data.frame(pca_mod$x, Species=iris$Species) 

## p1直接展示PCA的结果

p1 <- ggplot(df_pc, aes(PC1, PC2, col=Species)) + 
  geom_point(aes(shape=Species), size=2) +   
  labs(title="Iris Clustering (P1)", 
       caption="Source: Iris") + 
  coord_cartesian(xlim = 1.2 * c(min(df_pc$PC1), max(df_pc$PC1)),
                  ylim = 1.2 * c(min(df_pc$PC2), max(df_pc$PC2))) +
  scale_color_manual(values = c('#e41a1c','#377eb8','#4daf4a')) 

## p2使用ggalt将三个物种分别圈出

df_pc_set <- df_pc[df_pc$Species == "setosa",]

p2 <- p1 + labs(title="Iris Clustering (P2)") + 
  geom_encircle(data = df_pc_set, aes(x=PC1, y=PC2), s_shape=0.5, expand=0.05, size=5, show.legend = T) + 
  geom_encircle(data = df_pc[df_pc$Species == 'versicolor',], s_shape=0.5, expand=0.05, size=5, fill='#377eb840', show.legend = F) +
  geom_encircle(data = subset(df_pc, Species=='virginica'), s_shape=1, expand=0.05, fill='#4daf4a40', colour="#4daf4a00")

p1 + p2

ggalt.png

  上图的变化利用 ggalt 中的 geom_encircle 函数完成,想要完成上面的各种变化只需要了解下面几个问题即可。

怎么指定所需圈的数据?

若不指定,则会圈出所有数据。
setosa 采用 ggplot2 输入数据的方式,先外部构建 df_pc_set ,然后指定 xy 轴所使用的数据,这里提醒一下, aes(x=PC1, y=PC2) 是可以使用其他列的数据,根据需求改动即可。
versicolorvirginica 则分别使用数据框提取子集和使用 subset 函数提取子集的方式指定所需圈出的数据。

画的圈有哪些可调的参数?

圈的平滑度 s_shape:0-2之间的一个数,以1为分界线,向上平滑,向下崎岖,1为直线连接。
圈的拓展度 expand:负数收缩,正数扩张。
圈的粗细 size:注意是圈的线的粗细。
圈的颜色 fillcolour:二者均为修改颜色的参数,但是分别对应圈内填充的颜色和圈的线的颜色。
圈的图例 show.legend:后接逻辑值(TRUEFALSE),根据所需情况进行选择。

小技巧
  上图中并没有使用 alpha 参数来调整透明度是怎么获得透明效果的填充,而且 virginica 圈的线是怎么消失的?
  上述问题均通过16进制颜色后面添加一个两位数来调整颜色的透明度,所不同的是完全透明和半透明。而之所以不用 alpha 调整透明度,是因为它只能调整填充色的透明度,不能调整线的透明度,四舍五入就等于我不想用。

  最后需要说明的是 ggalt 的功能远不止 画圈圈,有兴趣的可以去参考资料2中继续挖掘。


参考资料:
1.50个ggplot2可视化案例
2.hrbrmstr/ggalt