R语言散点图-- ggplot2: scatterplot()

R语言作图点滴积累,今天要记录ggplot2中散点图的做法。散点图算是数据展示中非常基础的一种方法了吧,一般用于展示两个变量之间的关系(比如线性相关)。按照惯例,我每次讲一个新的图都会用一个我实际使用的例子,先来说说今天做这个散点图的例子吧:

问题描述:
我有两个变量,一个变量是蛋白相互作用网络中节点的度(degree),另一个变量是这些蛋白参与形成的复合物的个数;现在我想看看,一个蛋白参与形成的复合物个数(Number of complexes)是否跟它的度(degree)相关。
上面描述的这个问题,就是一个很典型的可以通过散点图来展示的例子。先来个数据快照(显示前10个数据点):

ProteinID No. complex Degree
P1 188 125
P2 128 76
P3 119 102
p4 95 66
P5 95 110
P6 80 68
P7 66 61
P8 57 84
P9 46 40
P10 46 45

漂亮的散点图要一步一步来

1. 首先来个简单的散点图

#Import data
> dat <- read.table("ProteinDegree_complex.txt",header = TRUE)

#plot a simple scatter plot
> library(ggplot2)
> p <- ggplot(dat,aes(x=degree,y=complex)) + geom_point(shape=19)) +
    xlab("Degree") + ylab("Number of complexes")
> p

note:

  • geom_point(): 是画散点图的函数,里面可以添加各种参数,用于设置散点图的形状、大小、颜色等,比如形状shape = 19, 表示的是较大的实心原点
  • xlab和ylab:两个函数分别设置x和y坐标轴的标题
    这个简单的散点图看起来是这样滴:


    简单的散点图

2. 如果想要拟合一条直线呢

#Import data
> dat <- read.table("ProteinDegree_complex.txt",header = TRUE)

#plot a simple scatter plot
> library(ggplot2)
> p <- ggplot(dat,aes(x=degree,y=complex)) + geom_point(shape=19)) +
    xlab("Degree") + ylab("Number of complexes") + 
    geom_smooth(method = lm)
> p

ggplot2 提供一个函数自动添加拟合的曲线(包括直线),当然该函数底层肯定是做了拟合分析的,比如线性回归分析等。

  • geom_smooth():这个函数就是为散点图添加一条平滑的曲线(包含直线),它有个参数method, 指定曲线平滑方法,可选"lm", "glm", "gam", "loess", "rlm",这几个具体表示什么意思,大家动动手,自己谷歌之,默认会使用"loess"。

下面两个图分别是使用了"lm"和"loess":

拟合直线
拟合曲线

给散点图加了直线,可是这个直线拟合得怎么样,以及拟合的直线的参数ggplot2并没有提供,为了图的信息更完整,我们应当考虑给这个拟合的直线加上公式,以及拟合的R2值。这样之后,我们从图上可以得到些什么信息呢?
首先,我们可以很容易知道degree和complex数目是呈正相关关系的,通过拟合直线和公式可以知道两个变量的线性关系强弱;然后,然后就是一堆不知道是啥的黑点...

总感觉还是缺少些什么,仔细看看这个散点图,你会不会想知道图中degree很高且参与很多复合物的这几个蛋白是什么?这样的蛋白一定是生物细胞中十分重要的蛋白。所以呢,我们可以把最靠近右上角的前10个点给高亮出来,甚至给这些点表示label(基因名)。说干就干,看代码:

#Import data
> dat <- read.table("WD40_complex_degree.out",header = TRUE)


#edit the formula for the fitted line
> formula <- sprintf("italic(y) == %.2f %+.2f * italic(x)",
                   round(coef(dat.lm)[1],2),round(coef(dat.lm)[2],2))
r2 <- sprintf("italic(R^2) == %.2f",summary(dat.lm)$r.squared)
labels <- data.frame(formula=formula,r2=r2,stringsAsFactors = FALSE)

#plot the simple scatterplot
> p <- ggplot(dat,aes(x=degree,y=complex,colour=degree>=63)) + geom_point(shape=19) +
  xlab("Degree of WD40 proteins") + ylab("Number of complexes")

#linear regression analysis
> dat.lm <- lm(complex ~ degree, data = dat)

#add a line and labels for the formula 
> p <- p + geom_abline(intercept = coef(dat.lm)[1],slope = coef(dat.lm)[2]) + 
  geom_text(data=labels,mapping=aes(x = 15,y=175,label=formula),parse = TRUE,inherit.aes = FALSE,
            size = 6) + 
  geom_text(data=labels,mapping=aes(x = 15,y=165,label=r2),parse = TRUE,inherit.aes = FALSE,
            size = 6) +
 #add labels(gene name) for top 10 degree-ranked proteins
  annotate(geom = "text",x=annoText$degree-1,y=annoText$complex-2,label=annoText$WD40id, size=4.0)
> p + theme(legend.position = "none") + theme(axis.title = element_text(size = 16),
                                            axis.text = element_text(size = 12,colour="black"))

代码一下子长了好多(囧),我们可以与前面的比较下,

  • 首先画简单散点图的那部分代码(间代码注释)添加了"colour = degree>=63",这句的目的其实是对所有点根据条件“degree>=63”进行了分组,不同颜色表示;
  • 其次,发现这里少了一句代码,对了,就是geom_smooth(method=lm),因为前面加了分组信息,geom_smooth会在不同组里分别拟合曲线,这并不是我们想要的,我们只是想高亮出一些点而已。所以,这里先不直接拟合了, 后面再手动拟合并添加直线;
  • lm(complex ~ degree, data = dat):这个是手动做线性回归分析
  • geom_abline():根据上面回归分析,画拟合的直线,从上面的分析中提取出 截距 coef(dat.lm)[1]和 斜率 coef(dat.lm)[2])即可;
  • geom_text():这个函数给图中添加了拟合直线的公式和R2;这里我们提供了新的data,所以,要注意的是后面inherit.aes = FALSE这个设置很重要,表示我们不继承ggplot函数中使用的data,不然会报错。
  • annotate():这个函数通过制定geom="text",在图中指定的地方画上标签,可以提供坐标
  • theme(legend.position = "none"):去除legend,这里我做的时候也出现一个问题,去除legend的另一种方法是p + guides(fill = FALSE),但是,我最新使用这个代码的时候,并没有起作用,不知道是不是我的Rstudio没有反应还是出现bug了,大家可以自己试试;
  • theme(axis.title...):这些都是对图中的文字进行美化一下,加大坐标轴标题的文字啊之类的。

最后的图是这个样子的:

最后的样子
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容

  • 简介 文章较长,点击直达我的博客,浏览效果更好。本文内容基本是来源于STHDA,这是一份十分详细的ggplot2使...
    taoyan阅读 51,015评论 7 159
  • 老潍坊,解放前称为潍县,历史悠久,人杰地灵,经济文化发达,一向是胶东交通军事重镇。现在,当你漫步街头,仍可...
    鸿鹄学院阅读 1,119评论 6 3
  • 以前总觉得生老病死人生常态,当人家诉说自己遭遇病痛、离别、困苦时常常安慰说:我能明白。其实这不过是一种随口漫...
    萤光子阅读 156评论 0 0