Thomas Lin Pedersen简直是个天才,最近patchwork动作很大,看到我都准备转投它的怀抱,把旧爱cowplot给扔了。

我们知道patchwork一出来,就推出+号来拼图,最近又搞出了|/两个操作符。让整个拼图看起来很舒服。

先来画几张图:

library(ggplot2)
p1 <- ggplot(mtcars) + 
  geom_point(aes(mpg, disp)) + 
  ggtitle('图一')

p2 <- ggplot(mtcars) + 
  geom_boxplot(aes(gear, disp, group = gear)) + 
  ggtitle('图二')

p3 <- ggplot(mtcars) + 
  geom_point(aes(hp, wt, colour = mpg)) + 
  ggtitle('图三')

p4 <- ggplot(mtcars) + 
  geom_bar(aes(gear)) + 
  facet_wrap(~cyl) + 
  ggtitle('图四')

Continue reading

小伙伴发来这个图,问我是不是bug,这真是犯了程序员的社交礼仪。

你如果对一个程序员说,“你的代码有bug。” 他的第一反应是:

    1. 你的环境有问题吧
    1. 傻逼你会用吗。

如果你委婉地说:“你这个程序和预期的有点不一致,你看看是不是我的使用方法有问题。”

他本能地会想:“操,是不是出bug了!”

这显然不是bug,这是绝大多数人对ggplot2的误解,他们认为用xlimylim是放置一个窗口去看你的图,然而在ggplot2是限定一个窗口去过滤你的数据,并重新画图!你的数据被过滤了!如果是放置窗口在图上,一条线从A到B,如果B在窗口之外,那么线被截断了,你看到半条线,但如果是过滤数据呢?B不复存在,那么线条A到B也不复存在,没有B,A到B的线画不出来。就是这样,所以这绝逼不是bug,而是程序员本能反应的第二种情况,你用错了。

那么怎么样不过滤数据,而只是设置可视化窗口呢?你基本上很少看到有人这么用,因为几乎99%的人都只知道xlimylim,一般人我也不告诉他,快点拿去小抄把下面的代码记录一下。

Continue reading

I post this because I am facing the same problem: I want to change the text of the label (not the font, the face, the colour, etc: the text itself) of the leftmost panel which is automatically called “Tree” by ggtree. As far as I understand, and contrary to what is posted below, the “theme” thing of ggplot2 only allows to change the appearance of the panel header, not the text of the panel title itself… So how to go about that?

这是google group里的问题,说的是facet_plot会把画树的panel叫做Tree,而他想改名,于是我就写了一个函数,facet_labeller来回应这个问题。

Continue reading

I’ve been having great success with ggtree now and have recommended it to several colleages here in Oxford.

Is there any way to seperate the legend in heatmaps? Eg I have plotted a tree in a circular style with outer rings given extra data - I would like a seperate key for each ring - is this possible?

This is a user question. Plotting multiple heatmaps that align to the phylogenetic tree is easy with gheatmap function.

Here is a simple example:

library("ggplot2")
library("ggtree")

nwk <- system.file("extdata", "sample.nwk", package="treeio")

tree <- read.tree(nwk)
circ <- ggtree(tree, layout = "circular")

df <- data.frame(first=c("a", "b", "a", "c", "d", "d", "a", "b", "e", "e", "f", "c", "f"),
                 second= c("z", "z", "z", "z", "y", "y", "y", "y", "x", "x", "x", "a", "a"))

rownames(df) <- tree$tip.label


p1 <- gheatmap(circ, df[, "first", drop=F], offset=.8, width=.1,
               colnames_angle=90, colnames_offset_y = .25)
p2 <- gheatmap(p1, df[, "second", drop=F], offset=5, width=.1,
               colnames_angle=90, colnames_offset_y = .25)

Continue reading

用ggplot2画3D

在《扪心自问,meme几何?》一文中,我画了一只兔子,今天给大家演示一下画一只3D版本的兔子,我们知道ggplot2不支持3D,只能画2D的图,但3D其实只是视觉上的,显示在你屏幕上的,同样只是2D。所以我们要做的,就是把3D的坐标转换成2D,然后画出2D的图片来,而这2D看上去有3D的效果。

Continue reading

pheatmap我其实用的次数不多,但在帮别人解决一些问题之后,比如:

我发现这包的交互能力是比较差的,它就像传统的plot函数一样,命令一打下去,就直接画图,虽然它其实是有输出的,但事实上超出了一般用户的理解能力,它的输出,比如说可以用cowplot来拼图,我在上面链接的那篇文章中皆来演示,然而很多人问我,怎么把pheatmap画的热图和ggplot2的图,用cowplot来拼。这就是因为拼图的方法超出了很多的理解范围,看过演示,也只能照猫画老虎,过后也就忘记了。有没有办法用大家可以理解的方法来拼?这样就不太容易忘记,答案是肯定的,我下次再讲。今天先讲一讲其前提条件。

Continue reading

说到世界杯,我是不追的,但1998年法国世界杯我还是有印象的,那时候读初中的我,一直在集邮,那年代没有网购,通讯基本靠吼,当年的我已经是个老司机了,通过邮政汇款,买了好多东西,包括1998年世界杯从法国寄往中国的首日封,当然锁在老家的柜子里,尘封多年,所以我现在也没办法随手拍一张照片给大家分享。

另一件事,同样是1998年,那年升高一,开学第一天,老师让大家自我介绍一下,有位帅哥在见面第一天,就立了flag,说自己中考没考好,是因为看世界杯了,他高考必定要怎么样怎么样,毕竟世界杯是四年一次。你一个交钱进学校的学渣,牛逼吹大了,我印象深刻,所以我后来留意了一下这家伙高考上了那家高校,结果是「中山大学网络教育学院」,也就是电视大学!真的是情节反转如疾风!

转发5个群,Y叔送你一顶帽子》这一篇文章写的是加圣诞帽子,但你要加个C罗、梅西,有什么差别吗?没有!你要加某球队的队服,有什么差别吗?没有。所以要制作世界杯专属头像,已然可以用ggimage纯代码生成。

Continue reading

Author's picture

Guangchuang Yu

Bioinformatics Professor @ SMU

Bioinformatics Professor

Guangzhou