R繪圖(1): 在散點(diǎn)圖邊緣加上直方圖/密度圖/箱型圖

當(dāng)我們在繪制散點(diǎn)圖的時(shí)候,可能會遇到點(diǎn)特別多的情況,這時(shí)點(diǎn)與點(diǎn)之間過度重合,影響我們對圖的認(rèn)知。為了更好地反映特征,我們可以加上點(diǎn)的密度信息,比如在原來散點(diǎn)所在的位置將密度用熱圖的形式呈現(xiàn)出來,再比如在主圖的邊緣加上直方圖等來反映密度。具體實(shí)現(xiàn)如下:
先導(dǎo)入數(shù)據(jù),除了ggplot2,還有一個(gè)ggExtra包

library(ggplot2)
library(tidyverse)
library(ggExtra)
df=read.table("20191126P31_HTODemux_CiteFuse.txt",header = T,row.names = 1,sep = "\t",stringsAsFactors = F)

#數(shù)據(jù)格式如下
# head(df)
# HTODemux tag2 tag3 CiteFuse
# AAACCCAAGTCATACC  doublet 6323 1582  doublet
# AAACCCAAGTTGTCGT     tag3   17 3760     tag3
# AAACCCACATGAGAAT     tag3   32 2614     tag3
# AAACCCAGTAACTGCT     tag3   30  699     tag3
# AAACCCAGTACCAGAG     tag2 4425   60     tag2
# AAACCCAGTACGATGG     tag3   40 8043     tag3

#每一組的占比,可以放在圖的右上角
group_labels=paste("tag2: 0.3844",
                   "tag3: 0.5000",
                   "doublet: 0.0844",
                   "negative: 0.0312",sep = "\n")

原圖的繪制

p=df%>%ggplot(aes(x=log(tag2),y=log(tag3),color=CiteFuse))+geom_point(size=2)+
  annotate("text",x=11,y=11,label=group_labels,color="black",size=6)+ #注釋類型為“文本”類型,位置在x=11,y=11的位置,這張圖橫縱軸大約為12,因此(11,11)大概在右上角的地方
  scale_x_continuous("tag2_UMI_ln",breaks = seq(0,12,2))+
  scale_y_continuous("tag3_UMI_ln",breaks = seq(0,12,2))+
  theme_bw()+
  theme(
    axis.text.x.bottom = element_text(size = 16), #下面兩行調(diào)整坐標(biāo)軸刻度的文本大小
    axis.text.y.left = element_text(size = 16),
    axis.title.x = element_text(size = 18), #下面兩行調(diào)整坐標(biāo)軸title的文本大小
    axis.title.y = element_text(size = 18),
    legend.text = element_text(size = 18), #下面兩行調(diào)整圖例文本大小
    legend.title = element_text(size = 18),
    legend.position = c(0.9,0.1), #圖例的位置,(0.9,0.1)是一個(gè)相對坐標(biāo),假設(shè)橫縱軸長為1
    legend.key = element_blank(), #下面兩行將圖例的底層去掉,因?yàn)槭前咨?,所以去不去看不出來,只有在AI編輯圖片的時(shí)候才能看到
    legend.background = element_blank(),
    panel.grid.major = element_blank(), #下面兩行將圖中g(shù)gplot2默認(rèn)的橫線豎線去掉
    panel.grid.minor = element_blank()
  )
pdf("raw.pdf",width = 10, height = 10)
p
dev.off()

密度圖可以用smoothScatter()繪制

pdf("smoothScatter.pdf",width = 7, height = 7.5)
smoothScatter(log(df$tag2),log(df$tag3),xlab="tag2_UMI_ln",ylab="tag3_UMI_ln")
dev.off()

這種密度圖還是比較常用的,不過在此處與原圖相比,失去了分組信息,有點(diǎn)顧此失彼。我們看一下另一種方案,主要用到的就是ggExtra包里面的ggMarginal()函數(shù)。

p1=ggMarginal(p, type="histogram", fill = "lightblue", xparams = list(bins=40), yparams = list(bins=40))
pdf("histogram.pdf",width = 10, height = 10)
p1
dev.off()

xparams和yparams分別用來調(diào)整兩個(gè)方向的參數(shù),這里我只調(diào)整了bin的數(shù)量,即每一個(gè)方向有40個(gè)柱形。

p2=ggMarginal(p, type="density", fill="lightgrey", color="lightgrey")
pdf("density.pdf",width = 10, height = 10)
p2
dev.off()

fill和color分別調(diào)整填充顏色和邊的顏色

p3=ggMarginal(p, type="boxplot", size=7, xparams = list(color="black",size=1), yparams = list(color="grey",size=1))
pdf("boxplot.pdf",width = 10, height = 10)
p3
dev.off()

size=7表示主圖長/寬是附圖的7倍,list()里面的size表示箱型圖邊的寬窄

p4=ggMarginal(p, type="densigram",fill="lightblue",color="purple")
pdf("densigram.pdf",width = 10, height = 10)
p4
dev.off()

最后一個(gè)圖是直方圖和密度圖的組合


針對我給出的原圖,在主圖的邊緣加密度圖看上去是不錯(cuò)的選擇,感興趣的小伙伴可以試試看~

因水平有限,有錯(cuò)誤的地方,歡迎批評指正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容