基于plot函数去绘图时,图例可以单独绘制再添加,比较容易修改图例中散点的形状,但是ggplot2绘图时很少有单独调节散点形状的步骤
今天正好有这个需求,做一个记录
首先准备一下数据并做一些计算
library(ggplot2)
library(vegan)
data(iris)
iris$Group <- iris$Species %>% do::Replace(from = 'setosa',to='G1')
iris$Group[grep('G1',iris$Group,invert = T)] <- 'G2'
## 获得了G1和G2两组,其中G2中包含2个Species
NMDS.out <- metaMDS(iris[,c(1:4)],distance = 'bray')
NMDS.out.meta <- cbind(iris[,c(5:6)],scores(NMDS.out),by='row.names')
Species中setosa属于G1,其余的versicolor和virginica属于G2
下面绘图想把Species的三类分别映射为不同颜色,Group的两类映射为点的不同形状
ggplot(data = NMDS.out.meta,aes(x=NMDS1,y=NMDS2,fill=Species,shape=Group))+
scale_shape_manual(name='Group',values = c(21,22))+
geom_vline(xintercept = 0,linetype =2)+
geom_hline(yintercept = 0,linetype =2)+
geom_point(size=3)
直接绘图,发现图片中点的形状是符合预期的,但是图例中点全是黑色
推测可能因为图例中点使用的是默认只有color属性而没有fill属性的点类型,与我们绘图指定的点类型不同
因此修改图例点类型即可
## 方案一 修改为统一的空心可填充圆
ggplot(data = NMDS.out.meta,aes(x=NMDS1,y=NMDS2,fill=Species,shape=Group))+
scale_shape_manual(name='Group',values = c(21,22))+
geom_vline(xintercept = 0,linetype =2)+
geom_hline(yintercept = 0,linetype =2)+
geom_point(size=3)+
guides(fill=guide_legend(override.aes = list(shape = 21)))
## 方案二 挨个赋值,同步映射形状与填充
ggplot(data = NMDS.out.meta,aes(x=NMDS1,y=NMDS2,fill=Species,shape=Group))+
scale_shape_manual(name='Group',values = c(21,22))+
geom_vline(xintercept = 0,linetype =2)+
geom_hline(yintercept = 0,linetype =2)+
geom_point(size=3)+
guides(fill=guide_legend(override.aes = list(shape = c(21,22,22))))