當咱們在繪製散點圖的時候,可能會遇到點特別多的狀況,這時點與點之間過分重合,影響咱們對圖的認知。爲了更好地反映特徵,咱們能夠加上點的密度信息,好比在原來散點所在的位置將密度用熱圖的形式呈現出來,再好比在主圖的邊緣加上直方圖等來反映密度。具體實現以下:
先導入數據,除了ggplot2,還有一個ggExtra包函數
library(ggplot2) library(tidyverse) library(ggExtra) df=read.table("20191126P31_HTODemux_CiteFuse.txt",header = T,row.names = 1,sep = "\t",stringsAsFactors = F) #數據格式以下 # 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), #下面兩行調整座標軸刻度的文本大小 axis.text.y.left = element_text(size = 16), axis.title.x = element_text(size = 18), #下面兩行調整座標軸title的文本大小 axis.title.y = element_text(size = 18), legend.text = element_text(size = 18), #下面兩行調整圖例文本大小 legend.title = element_text(size = 18), legend.position = c(0.9,0.1), #圖例的位置,(0.9,0.1)是一個相對座標,假設橫縱軸長爲1 legend.key = element_blank(), #下面兩行將圖例的底層去掉,由於是白色的,因此去不去看不出來,只有在AI編輯圖片的時候才能看到 legend.background = element_blank(), panel.grid.major = element_blank(), #下面兩行將圖中ggplot2默認的橫線豎線去掉 panel.grid.minor = element_blank() ) pdf("raw.pdf",width = 10, height = 10) p dev.off()
密度圖能夠用smoothScatter()繪製3d
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()
這種密度圖仍是比較經常使用的,不過在此處與原圖相比,失去了分組信息,有點顧此失彼。咱們看一下另外一種方案,主要用到的就是ggExtra包裏面的ggMarginal()函數。code
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分別用來調整兩個方向的參數,這裏我只調整了bin的數量,即每個方向有40個柱形。
blog
p2=ggMarginal(p, type="density", fill="lightgrey", color="lightgrey") pdf("density.pdf",width = 10, height = 10) p2 dev.off()
fill和color分別調整填充顏色和邊的顏色
圖片
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表示箱型圖邊的寬窄
element
p4=ggMarginal(p, type="densigram",fill="lightblue",color="purple") pdf("densigram.pdf",width = 10, height = 10) p4 dev.off()
最後一個圖是直方圖和密度圖的組合
string
針對我給出的原圖,在主圖的邊緣加密度圖看上去是不錯的選擇,感興趣的小夥伴能夠試試看~it
因水平有限,有錯誤的地方,歡迎批評指正!io