meme无非是照片上加两行字,meme这个包本来是练手之作,用来模拟ggplot2的api。结果我后面又实现了字体阴影效果,这次我又带来了外部字体支持。

加载外部字体在R上面主要有extrafont和showtext两个实现,特别是showtext用起来还是非常简单的。我在meme包里写了font_import函数,内部就是用showtext,只是简单的包装了一下,这样小白用户可以直接下个字体就开撸。有阴影效果,有搞笑字体,就万事具备了,这俨然是个专业的meme工具了。

Continue reading

取子集对于进化树可视化来说是非常常见的,我们要区分内部节点和外部节点,我们也可能想针对某些特点的节点进行注释。

ggplot2现在所有图层都不支持直接取子集,所以呢ggtree就自己定义了一些修改的图层,包括geom_text2, geom_label2, geom_point2geom_segment2,这些图层和ggplot2的版本唯一差别就是支持取子集。这样对于我们做注释来说,就更方便了。

比如说我想给内部节点打点,可以用:

ggtree(tree) + geom_text2(aes(label=label, subset=!isTip), hjust=-.2) +
        geom_point2(aes(subset=!isTip), color="red", size=3)

Continue reading

我这个公众号不像大多数所谓的生信从入门到精通的各种其实只是搬运点入门教程的群众喜闻乐见的公众号。正如我在《为什么要开这个公众号》里说的,这是小众的,有个人色彩的各种原创文。我不可能像其它公众号一样招两小弟当客服,很多人在公众号后台向我扔了许多问题,由于个人精力有限,只能优先解答「知识星球」的问题,上次写的《同一数据多变量分组的boxplot?》,图虽然简单,却穿着好多件马甲,而我把它扒光了给你看🙈

上面这个图,你看着高大上吧,我都可以吐它一脸口水。每一个有灰色背景的图,在x轴上violin都够到边界了,其实所有的violin都够到了,这证明什么?每个violin之间其实不可比较!你能想像几个独立的数据,在统一的bin width情况下,画density curve,竟然最高点都一样高吗?显然可能性几乎为0。这个如果使用ggplot2的话,可以使用scale='width'强制拉成一样高,但我不推荐,正如我前面说的,不可比较了。默认参数scale='area',积分面积一样,和density curve一样解析,另外的参数scale="count",高度与计数同比例,和histogram一样解析,而scale='width'强制拉成一样高,如果没有在显眼处说明,误导性太强。

画这种图也可以手工拼,这样就简单了。在你需要的情况下,加个灰色背景嘛,最后拼图嘛。当然拼图不一定要在illustrator里拼,比如你用grid,先画好坐标轴,然后水平上定义几个一样大的viewport,每一个violin都画在相应的viewport里面,对于画图函数来说,viewport就是整个画布了(虽然只是画布里的一块区域),所以你要么画violin,要么在画之前先画个矩阵,一路画下来,代码可以直接生成这样的图,但这图每一个violin都是独立画的(当然也不是完全独立,每一个水平上的ylim是有统一的),就算代码一步生成,也跟illustrator里拼没两样。


这里我要教你用ggplot2自动生成,其实解决思路早已推送过,请看《facet_plot:加图层到特定分面,方法二》,也正如我在《什么!你的图上有一双看不见的手》里说的,你们以为我在教ggtree,其实同时在教ggplot2。

Continue reading

听说你想打水印?

正如我在《用R画meme ;)》里说的,meme包就可以拿来画,当然这个包是设计来画meme的,所以文本只会打在中间,如果你想在右下角之类的,不好意思,我没提供选项让你调文本位置,氮素,meme依然是你的好帮手,怎么说呢,meme不单能帮你读图片,还能用grid画出来,这意味着你可以用grid.text随便加个文本就OK了。

实例演示一发:

library(meme)
u <- system.file("angry8.jpg", package="meme")
x <- meme(u)
print(x)
grid.text("biobabble", x=.9, y=.05, 
	gp=gpar(col='white', cex=1.2))

Continue reading

Sercan Kahveci

Greetings Mr. Yu,

I am very happy that this package exists. Thank you for making it! I would like to request a feature, to ensure the package is able to compete with professional meme-creation tools like memegenerator and paint.net. Since memes often use the font Impact, in white and with black outline, I believe the package would be more powerful if it also did that automatically.

Regards,

Sercan Kahveci, MSc

Content creator at Questionable Research Memes on Facebook https://www.facebook.com/QResearchMemes/

上次一篇《用R画meme ;)》把脸书在做MEME的人都给炸出来了,专业人士给出专业建议,要用Impact字体,并且要让字体出现阴影效果,这真是厉害了,感觉有点神奇,但他一句,这样就可以和专业工具PK了,着实太刺激了,我决定试一试能不能搞个阴影效果。结果还真让我搞成了,文本有一种浮在上面的错觉。

我们知道meme包是grid写的,我的输出是grob对象,当我半夜调试到2点,带着兴奋入睡之后,一点都睡不安稳,早上早早就迷迷糊糊在床上想着,既然我造出了文本阴影效果的grob对象,我应该封装成geom图层,送给ggplot2用户。

Continue reading

小密圈的问题,不是三两句话可以说明白的事情,必须要写文来解答,上一次写文是《听说你还不会画热图》,里面正好吐槽了某知乎大V的「除了ggplot2之外其它都是鸡肋」,这次正好也可以再次呼应一下。

这个图明显是R的base graphics做的,图是可圈可点的,能做出这图来,也已经是告别了只会用plot的低级趣味。这其实是4个图拼起来的,第一个图只是多了个y轴而已,它们画起来是一样的,那就是只画boxplot,不画x和y轴,(你可能会说不是有x轴?),x轴是后面再加上去的,而且加x轴的时候,不写labels,只有线条没有文本(你可能又会说明明有文本!),因为axis这个函数只支持labels要么是水平的,要么是垂直的,旋转某个角度是不支持的,所以labels是额外再打上去的。这里一张小小的图,门道还是挺多的。

Continue reading

据说1024是程序员的节日,就在这一天,Y叔开始了第一次的网络讲座,首次在网络上露面。内容就是上一周预告的《线上沙龙》。

很多人想要学ggplot2 + ggtree,但我的定位不是技术性的培训,而是学术讲座,所以一开始把问题摆出来,是有一些问题存在,有knowledge gap,然后我要去解决它。当然考虑到听众的knowledge gap也很大,我在介绍ggtree的之前,也帮大众撸了一篇R的画图,在这简短的时间里,你应该了解了R几个画图系统的关系,base和grid我在slides里写graphic system,但lattice和ggplot2我写的是data visualization system,我对它们是有区别对待的,像lattice和ggplot2自己是不成一体的,但提供了高阶的数据可视化方法/语法。听完讲座你也应该了解ggplot2,知道要怎样去入门,知道重点该学什么。

Continue reading

Author's picture

Guangchuang Yu

a senior-in-age-but-not-senior-in-knowledge bioinformatician

Postdoc researcher

Hong Kong