R語言作圖點滴積累管引,今天要記錄ggplot2中散點圖的做法士败。散點圖算是數(shù)據(jù)展示中非常基礎(chǔ)的一種方法了吧汉匙,一般用于展示兩個變量之間的關(guān)系(比如線性相關(guān))拱烁。按照慣例,我每次講一個新的圖都會用一個我實際使用的例子噩翠,先來說說今天做這個散點圖的例子吧:
問題描述:
我有兩個變量戏自,一個變量是蛋白相互作用網(wǎng)絡(luò)中節(jié)點的度(degree),另一個變量是這些蛋白參與形成的復(fù)合物的個數(shù)伤锚;現(xiàn)在我想看看擅笔,一個蛋白參與形成的復(fù)合物個數(shù)(Number of complexes)是否跟它的度(degree)相關(guān)。
上面描述的這個問題,就是一個很典型的可以通過散點圖來展示的例子猛们。先來個數(shù)據(jù)快照(顯示前10個數(shù)據(jù)點):
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(): 是畫散點圖的函數(shù)念脯,里面可以添加各種參數(shù),用于設(shè)置散點圖的形狀弯淘、大小绿店、顏色等,比如形狀shape = 19, 表示的是較大的實心原點
-
xlab和ylab:兩個函數(shù)分別設(shè)置x和y坐標(biāo)軸的標(biāo)題
這個簡單的散點圖看起來是這樣滴:
簡單的散點圖
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 提供一個函數(shù)自動添加擬合的曲線(包括直線)庐橙,當(dāng)然該函數(shù)底層肯定是做了擬合分析的假勿,比如線性回歸分析等。
- geom_smooth():這個函數(shù)就是為散點圖添加一條平滑的曲線(包含直線)态鳖,它有個參數(shù)method, 指定曲線平滑方法转培,可選"lm", "glm", "gam", "loess", "rlm",這幾個具體表示什么意思浆竭,大家動動手浸须,自己谷歌之,默認會使用"loess"邦泄。
下面兩個圖分別是使用了"lm"和"loess":
給散點圖加了直線删窒,可是這個直線擬合得怎么樣,以及擬合的直線的參數(shù)ggplot2并沒有提供虎韵,為了圖的信息更完整易稠,我們應(yīng)當(dāng)考慮給這個擬合的直線加上公式,以及擬合的R2值包蓝。這樣之后驶社,我們從圖上可以得到些什么信息呢?
首先测萎,我們可以很容易知道degree和complex數(shù)目是呈正相關(guān)關(guān)系的亡电,通過擬合直線和公式可以知道兩個變量的線性關(guān)系強弱;然后硅瞧,然后就是一堆不知道是啥的黑點...
總感覺還是缺少些什么份乒,仔細看看這個散點圖,你會不會想知道圖中degree很高且參與很多復(fù)合物的這幾個蛋白是什么腕唧?這樣的蛋白一定是生物細胞中十分重要的蛋白或辖。所以呢,我們可以把最靠近右上角的前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"湿蛔,這句的目的其實是對所有點根據(jù)條件“degree>=63”進行了分組,不同顏色表示县爬;
- 其次阳啥,發(fā)現(xiàn)這里少了一句代碼,對了财喳,就是geom_smooth(method=lm)察迟,因為前面加了分組信息,geom_smooth會在不同組里分別擬合曲線纲缓,這并不是我們想要的卷拘,我們只是想高亮出一些點而已喊废。所以祝高,這里先不直接擬合了, 后面再手動擬合并添加直線;
- lm(complex ~ degree, data = dat):這個是手動做線性回歸分析
- geom_abline():根據(jù)上面回歸分析污筷,畫擬合的直線工闺,從上面的分析中提取出 截距 coef(dat.lm)[1]和 斜率 coef(dat.lm)[2])即可;
- geom_text():這個函數(shù)給圖中添加了擬合直線的公式和R2瓣蛀;這里我們提供了新的data陆蟆,所以,要注意的是后面inherit.aes = FALSE這個設(shè)置很重要惋增,表示我們不繼承g(shù)gplot函數(shù)中使用的data叠殷,不然會報錯。
- annotate():這個函數(shù)通過制定geom="text"诈皿,在圖中指定的地方畫上標(biāo)簽林束,可以提供坐標(biāo)
- theme(legend.position = "none"):去除legend,這里我做的時候也出現(xiàn)一個問題稽亏,去除legend的另一種方法是p + guides(fill = FALSE)壶冒,但是,我最新使用這個代碼的時候截歉,并沒有起作用胖腾,不知道是不是我的Rstudio沒有反應(yīng)還是出現(xiàn)bug了,大家可以自己試試瘪松;
- theme(axis.title...):這些都是對圖中的文字進行美化一下咸作,加大坐標(biāo)軸標(biāo)題的文字啊之類的。
最后的圖是這個樣子的: