查看原文
其他

ggsymbol让点图样式更加丰富的R包

biocoder YuLabSMU 2022-09-24

1.前言

ggplot2中的geom_point来画点图时, 常常会选择点的样式,其依赖的是grid中的pointsGrob。所以点的样式选择可以参考points中的pch参数,看过说明的同学都知道这个参数是用数字0-25,33-126来控制。每个数字代表一种样式,但我们平时能选择的样式也没几种。有时候要想画个多边形的点都很困难。于是,两个月前,我写了ggstar来画多种多边形的点,包括五角星,六角星,正五边形等等。具体可以参考《一个可以画星星图层的R包,了解下》。但是,这个包不能与geom_point的样式一起映射。上周李陈浩同学在biobabble群里问我,有没有考虑支持geom_point,我之前就有考虑的,只不过我觉得ggstar还是独立开会比较好。然后厚缊同学建议我整个symbol图层。所以,这两天我写了ggsymbol。这个包将geom_pointggstar中的部分样式整合在一起,这样就可以一起愉快映射。

2.所有的样式

这个包是整合了R自带的所有样式与ggstar中的starGrob的部分样式。之所以是ggstar部分样式,是因为自带样式中pch参数刚好在26-32没有相应的shape。所以我从ggstar中选了一些较容易区分开的starshape来填充了这部分。目前支持的样式以及它们对应的数字如下:

library(ggplot2)
library(ggsymbol)
d <- data.frame(p=c(0:127),f=c(rep("g",26), rep("s"7), rep("g"95)))
d$f <- factor(d$f, levels=c("g""s"))
p <- ggplot() + 
     geom_symbol(data=d, 
                 mapping=aes(x=p%%16, y=p%/%16, symbol=p, fill=f), 
                 size=4, stroke=0.5, show.legend=FALSE) +
     geom_text(data=d, 
               mapping=aes(x=p%%16, y=p%/%16+0.25, label=p), 
               size=3) +
     scale_symbol_identity() +
     scale_fill_manual(values=c("red""blue")) +
     xlab(NULL) +
     ylab(NULL) +
     theme(axis.ticks=element_blank(),
           axis.text=element_blank())
p

其中0-2533-127 是由pointsGrob提供, 而26-32则由ggstar中的starGrob提供。

3. Demo

无论ggstar还是ggsymbol都是较为底层的轮子或者说是原材料。有了这些原材料,脑洞够大的,就能想到应用场景。如火山图,网络图,曼哈顿图,或者联动ggtree等等。因为是基于ggplot2的语法来开发的,所以只要熟悉ggplot2,使用起来也完全没压力。ggsymbol提供了geom_symbol函数来生成图层,用symbol参数控制样式。对应的scale_symbol_manual来控制映射的图形样式。其余参数与geom_point一致。

p <- ggplot(data=iris, aes(x=Sepal.Width,y=Sepal.Length)) +
     geom_symbol(aes(symbol=Species, fill=Species), 
                 color="grey60", size=2.5,
                 stroke=0.5) +
     scale_fill_manual(values=c("#E41A1C""#377EB8""#4DAF4A")) +
     scale_symbol_manual(values=c(282221))

p


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存