前期松哥推送一張美圖,并用Graphpad Prism進(jìn)行模擬。一位才女夏雪留言說用R語言模擬,并供稿如下,分享與大家一同學(xué)習(xí)! 多嵌套圖拼接的R語言實(shí)現(xiàn) 《這張圖好美,你知道怎么做的嗎?》ggplot2仿圖 這次基于ggplot2的嘗試主要源于松哥近期的一篇推送《這張圖好美,你知道怎么做的嗎?》,感慨于Graphpad Prism作圖的簡潔,也嘗試用ggplot2還原了這個(gè)嵌套圖,權(quán)當(dāng)對(duì)兩種軟件的繪圖模塊進(jìn)行一個(gè)比較,希望能給各位小伙伴提供一個(gè)不同的視角。 原文研究設(shè)計(jì)及圖片還原思路 首先來看一下文獻(xiàn)的原圖吧~ 原圖 原文作者在對(duì)不同年齡(幼鼠和成年鼠),不同性別(雌/雄)進(jìn)行某種刺激后,在7個(gè)時(shí)間點(diǎn)(1為刺激前,6為最后1次刺激,7為刺激后一段時(shí)間)分別對(duì)3個(gè)效應(yīng)指標(biāo)進(jìn)行了測量。在進(jìn)行結(jié)果展示時(shí),作者放棄了常規(guī)的統(tǒng)計(jì)表格,選擇了上圖的形式,按照年齡,性別分為4層,每層3個(gè)子圖,分別反映3個(gè)不同的指標(biāo)。 不難看出,原圖由12個(gè)嵌套圖組成,每個(gè)嵌套圖又由1個(gè)主圖和1個(gè)子圖拼接而成。其中,主圖采用散點(diǎn)與誤差棒結(jié)合的形式展示了某效應(yīng)指標(biāo)在7個(gè)時(shí)間點(diǎn)的均值和標(biāo)準(zhǔn)誤,而每個(gè)時(shí)點(diǎn)與刺激前的差異顯著性則以“*”的形式進(jìn)行標(biāo)注;子圖則為柱狀圖與誤差棒的結(jié)合,主要比較了最后一次刺激及刺激后與刺激前效應(yīng)指標(biāo)水平的差異,同樣也標(biāo)注了兩兩比較的差異顯著性,與主圖的區(qū)別是,這里選擇了以橫線對(duì)兩個(gè)比較時(shí)點(diǎn)進(jìn)行了標(biāo)注。 基于以上思路,小x利用R軟件的ggplot2包對(duì)原圖進(jìn)行了還原: 仿圖 簡單地說,除了外邊框(合理懷疑原圖的邊框是AI或者PS后期處理的)和坐標(biāo)軸沒有完全實(shí)現(xiàn)(x軸時(shí)間點(diǎn)6和7之間截?cái)嗍。┩猓渌€算是基本還原了。 嵌套圖實(shí)現(xiàn) 借助ggplot2及ggsignif包,小x對(duì)嵌套圖A進(jìn)行了還原。兩個(gè)包的說明文檔可以參考: https://cran./web/packages/ggplot2/index.html https://github.com/const-ae/ggsignif 首先,生成模擬數(shù)據(jù)并加載所需的R包: #加載R包 library(ggplot2) #繪圖 library(ggsignif) #顯著性繪制 #圖A模擬數(shù)據(jù) group<-c(1,2,3,4,5,6,7) #分組 estimate<-c(15,8,7.5,6,7,5,12) #均值 lower<-c(14,7,6.5,5,6,4,11) #誤差限下限 upper<-c(16,9,8.5,7,8,6,13) #誤差限上限 a<-data.frame(group,estimate,lower,upper) #圖A'模擬數(shù)據(jù) b<-a[c(1,6,7),] b$group<-as.factor(b$group) #將時(shí)間點(diǎn)1,6,7處理為因子形式,以便在x軸上等距顯示各時(shí)間點(diǎn)效應(yīng)值。 自定義圖片的主題: windowsFonts( myFont = windowsFont("Arial Unicode MS") ) #加載所需字體:Arial Unicode MS mytheme<-theme( axis.line=element_line(size=0.5,colour="black"), axis.title=element_text(family="myFont",colour="black", size=12), axis.text=element_text(family="myFont",colour="black", size=12), legend.background=element_blank(), legend.key=element_blank(), legend.title=element_blank(), panel.background=element_blank(), panel.border=element_blank(), panel.grid=element_blank() ) #設(shè)置圖片坐標(biāo)軸(axis),圖例(legend)及面板(panel) 利用散點(diǎn)圖(geom_point)和誤差棒(geom_errorbar)的疊加,繪制嵌套主圖p1,并手動(dòng)標(biāo)注(geom_text)顯著性水平: p1<-ggplot(data=a,aes(x=group))+ #散點(diǎn)圖 geom_point(aes(y=estimate),size=4,colour=3)+ #誤差限 geom_errorbar(aes(ymin=lower,ymax=upper),width=0.2,size=0.8,colour=3)+ #設(shè)置坐標(biāo)軸 scale_y_continuous(breaks=c(0,5,10,15,20), limits=c(0,23))+ scale_x_continuous(breaks=c(1,2,3,4,5,6,7),limits=c(0.5,10.5))+ #標(biāo)注顯著性水平 geom_text(aes(y=upper+0.5), label=c("","***","***","***","***","***",""),colour=1,size=5)+ #設(shè)置x軸,y軸及標(biāo)題 labs(x="Stimulation",y="DA concentration(uM)",title="A")+ #設(shè)置主題 mytheme ![]() 利用條形圖(geom_bar)和誤差棒(geom_errorbar)的疊加,繪制嵌套子圖p2,并借助ggsignif包(geom_signif)標(biāo)注組間差異顯著性: p2<- ggplot(data=b,aes(x=group))+ #條形圖 geom_bar(aes(y=estimate),stat="identity",width=0.4,fill=3)+ #誤差限 geom_errorbar(aes(ymin=lower,ymax=upper),width=0.2,size=0.8,colour=3)+ #標(biāo)注顯著性水平 geom_signif(stat="identity",data=data.frame(x=c(1,2), xend=c(2,3), y=c(16.5,13.5), annotation=c(" * ", " *** ")), aes(x=x,xend=xend, y=y, yend=y, annotation=annotation), size=5)+ #設(shè)置坐標(biāo)軸 scale_y_continuous(breaks=c(0,5,10,15,20),limits=c(0,20))+ #設(shè)置x軸,y軸及標(biāo)題 labs(x="",y="DA concentration(uM)",title="A'") #設(shè)置主題 mytheme ![]() 利用生成ggplotGrob() 生成圖形對(duì)象列表(grob, graphical object)后,利用annotation_custom通過添加注釋的方式,向圖形內(nèi)部添加子圖: g<-ggplotGrob(p2) p01<-p1+ annotation_custom( g,xmin=7.5,xmax=10.5,ymin=12,ymax=25) ![]() ![]() 嵌套圖拼接 類似地,可以完成其余11幅嵌套圖(p02-p12)的繪制。 對(duì)于圖片的拼接,小x利用了gridExtra包實(shí)現(xiàn),說明文檔可以參考: https://cran./web/packages/gridExtra/index.html png(file = "C:/R/COPY.png", res =600, width =10000, height =10000) grid.arrange(p01,p02,p03,p04,p05,p06,p07, p08,p09,p010,p011,p012,ncol=3) dev.off() ![]() ![]() ![]() 嗯,到目前為止,圖片就基本還原了。至于外邊框和標(biāo)注,各位小伙伴就借助AI和PS進(jìn)行美化吧。希望你們覺得有意思。
|
|