手把手教你用R語言做科研繪圖拼接!!!!!

2021-03-02 Foodie 張yoyo

寫在前面

後天就要回學校了,有點捨不得,捨不得家裡2米的大床,捨不得我安靜的書房,捨不得我專屬的健身空間,捨不得一下樓就能吃到媽媽做的飯菜,捨不得老爸每周給我送水果熬的雞湯鴿子湯,當然也捨不得家鄉的朋友們。

其實,還有一個捨不得的,就是家中的這一平方米。

在家的7個多月時間裡,有1/2的時間都是在這一平米度過,在這裡處理了數據,完成了我真正意義上的第一篇英文paper和第一篇中文小論文,也自學了許多有趣的知識,寫了幾篇閱讀量還可以的推送。

所以,想在今天,臨出發前,和大家,再分享一個有趣、簡單但非常實用的小知識,我相信科研小白以及已經上路的研究生博士生們都會用到的。

畢竟回北京以後,我可能就又恢復到foodie美食博主的身份啦!


關於「繪圖拼接」

「繪圖拼接」,字面上的意思就是,把畫好的一堆圖,按照你想要的樣式、結構,拼起來,成為一個大的、有更多信息和內容的圖。

可能只是兩個圖簡單的橫向、縱向拼接。

也可能是多個類似主題圖的拼接,且共用了一個legend。

也可能是兩個複雜的圖的拼接,每個複雜的圖片裡面還含有更多子圖,reveal更多不同的信息。

那為何要掌握「繪圖拼接」呢?因為大多數的期刊,在投稿的時候,都會在投稿須知裡面說到,圖片數量不允許超過多少多少,有的說不許超過5個,有的不許超過6個,也有可能是4個!

所以,如果把這些子圖都分散開,那可能一個主題的圖,就要佔用4-6個圖片數量了,無法表達論文的全部內容。

當然,也有人說,那就分開自己拼唄,Word裡面手動拼!

是的,我曾經···也是這麼幹的··· 但是這個做法,實際上非常的不方便,每次調整圖的時候都要手動調節位置就算了,關鍵有時間真的做不到「整整齊齊」!其實你們可以看到我的(b)和(d)圖是有點歪的。

所以,如果以後想有進步,寫出更好的論文,投更好的期刊,這種「手動拼接」做法是不建議的!

那如何解放雙手,更簡單的實現拼接呢?


先說說R中的par()和customLayout

其實之前,我也是用R寫代碼拼圖的,但是只會簡單的par(),比如par(mfrow(2,2)),創建一個2*2的畫布,然後分別畫四個子圖。但是我發現,這種方法畫的圖①是不太美觀②拼接的也不太智能(也可能我沒深入挖掘這個方法),雖然它很實用,可以完美拼接R中的base繪圖對象,但是我後來還是慢慢拋棄了他。

當然,customLayout也不錯,聽名字就知道很「自定義」和「為所欲為」,可以拼接base繪圖對象也可以拼接ggplot2繪圖對象。比如:

先創建一個叫lay1的畫布,裡面有四個子圖空間(我這裡沒畫具體的子圖),寬比例是3:2(左:右),高比例是2:1(上:下)。

然後創建一個叫lay2的畫布,同樣是四個子空間,但是寬比例是3:5(左:右),高比例是2:4(上:下)。

然後就可以通過lay_bind_col()或者lay_bind_row()進行按列或者按行的拼接啦,比如我這裡按列拼接兩個畫布。並且指定了lay1寬度是lay2寬度的三倍。

所以大家可以使用customLayout包盡情的customize!


學會用R中的cowplot和patchwork包

前面嘰嘰喳喳半天,終於到了本推送的核心內容了,其實我最想介紹的是cowplot和patchwork這兩個包。

為何說這兩個包呢?因為他的拼接思路更符合我們人腦畫畫的思路,step by step,且和ggplot2包的結合特別好。而ggplot2是R中最強大的繪圖包,也是我最常用的,所以,我決定向大家推薦這二者!

首先要注意一下,cowplot包是可以直接install的,但是patchwork是要在github中加載的。如圖所示。

把這兩個包安裝完之後,就可以進行拼接了。由於本推送的重點在「拼接」,而非「畫圖」,所以不會具體解釋畫圖步驟,並且使用的也都是ggplot2中最常見的畫圖語法。

下面所有圖的例子都來自R中內置資料庫iris, mtcars和diamonds。

使用cowplot包進行拼接


大家可以發現,我們可以利用cowplot中的plot_grid()進行拼接,上下兩幅圖同樣是縱向拼接,但是上面的圖p5就拼接得整整齊齊,而下面圖的Y軸並沒有對齊。原因就是下面的圖p6沒有設置align="v",這裡的「v」是vertical的意思。所以如果是水平對齊,就要設置align="h",以保證X軸水平對齊。

同樣地,如果我想給拼接的兩個圖,添加標籤,以及設置相對寬度,高度呢?

這裡我做了水平拼接,設置了相對寬度是1:2,給兩個圖加了「A」和「B」標籤。

是不是很方便很簡單???

那如果有三個圖呢?或者更多的圖呢?

我們可以採取一個plot_grid()嵌套的方式來完成,比如下面這個圖,我先plot_grid()對p7和p8完成拼接,並標記為「B」和「C」,然後再用這一個整體和p9進行拼接。

當然,我們還有一個畫圖思路,同樣可以實現上面這個圖的拼接,只不過是通過ggdraw()來完成的,而不是plot_grid()。

通過代碼可以發現,這和我們小時候畫畫的思路是完全一樣的!!!

先把p10和p11拼接起來,兩個圖的相對寬度是1:2,拼起來的圖叫做p12。

然後開始拼接,先畫一個空圖ggdraw(),然後畫圖p9,後面四個數字x,y,z,w分別表示p9原點的相對坐標,和長寬佔比,同理開始畫p12,然後給p9和p12標籤,並說明標籤的位置和顏色。拼接出來如圖所示。

當然,你也可以三個分別直接畫上去,進行拼接。和上面對比一下代碼、圖,有沒有看出啥區別!

當然,有人會說,有沒有嵌套的拼接呢?

有的呀!

仔細看,這裡是先ggdraw(p7),也就是說,先畫好p7,然後後面的draw_plot(p8)的一系列操作就都是在p7畫圖基礎上去完成啦!這樣就實現了嵌套!

我相信有人會問,如何共用一個legend呢?

這裡就有一個get_legend()的操作,也就是說我先保留了p10的圖例,去掉了p11的圖例,即theme(legend.position="none"),然後我獲取p10的圖例,然後通過plot_grid()對去掉圖例的p10和本身沒有圖例的p11進行拼接,最後再進行一個複合拼接,將他們與圖例拼在一起。

(下圖只是一個我隨便做的例子,圖例對不上,重點看代碼)

簡單聊聊patchwork

其實能會使用cowplot()基本就可以完成我們正常的科研繪圖和拼接工作了,但是為啥要聊聊patchwork呢?因為他的語法實在是太簡單!太直觀!太可愛啦!

它的表達方式有很多種,比如:加減乘除,比如交集併集,比如花括號,但是其拼接思路就和我們做加減乘除一樣簡單!

該圖是由第一行代碼畫出來的

((p10+p11)+p7+p8+plot_layout(ncol=2))

大家可以自已試試其他兩行代碼,畫出來有什麼區別呢?自己動手加強理解!

至於最後圖片的導出問題,比如如何導出高質量的圖片,對dpi進行調整,請參考我之前寫的「科研小白可能會遇到的期刊圖片導出問題」

寫在最後

終於完成了在家的最後一篇推送,個人認為寫的過程還是很開心、充實的,因為寫推送與我而言,是愛好,也是利用輸出方式鞏固知識的一種方式。

為了寫這篇推送我也把這些代碼重複寫了很多次,加深了理解,所以說practice makes perfect,希望能夠對大家有所幫助吧!!!

歡迎大家閱讀、轉發、打賞、點讚一條龍呀~

相關焦點

  • 手把手教學,R語言基礎繪圖
    R語言是用於統計分析、繪圖的語言和操作環境。R的統計分析能力突出,有強大的數據展示能力。
  • 【零基礎入門】手把手帶你系統化學習R語言
    如果說有一門簡單易學、通俗易懂並且集上述功能為一體的程式語言讓科研人員從中解脫出來,R語言當仁不讓。 R語言是一款免費開源軟體,其提供了超過12000個R包,幾乎所有類型的數據分析任務都可以在R中完成。
  • R編程與R繪圖
    這時候R語言編程就會派上用場。例如從大的方面來看,投資方要決定在何處建立風力發電場,就需要採集天氣數據加以建模分析,評估各項目方案。從小的方面來看,個人是否應該購買某個理財產品,你需要獲取過去的市場信息,模擬未來可能的變化,計算該項資產未來的期望收益和標準差。所以說學習R編程就是學習在數據環境中解決問題,從中磨練技術、鍛鍊智力,還能得到滿足的快感。
  • 技術貼 | R語言:手把手教你畫upset集合圖
    導讀:venn可以分析不同數據集的交集,另外使用R語言UpSet函數包upset函數繪製集合圖可以更清晰的展示不同數據集的交集情況。你可能還喜歡技術貼 | R語言:ROC分析多樣性指數技術貼 | R語言:ggplot畫柱形圖、排序、著色技術貼 | R語言:手把手教你搞定ggplot柱形圖(一)技術貼 | R語言:手把手教你搞定
  • 獨家 | 手把手教你學習R語言(附資源連結)
    這套學習方法對於數據科學或R語言的初學者會很有用;如果讀者是R語言的老用戶,則會由本文了解這門語言的部分最新成果。R語言學習方法會幫助您快速、高效學習R語言。前言在開始學習之前,第一個要回答的問題是:為什麼要用R語言?或者R語言為何如此有用?
  • R語言從入門到精通:Day1-R語言的安裝
    在正式開始之前,我想對看到這篇文章的你提出一個小小的要求:不管你的第一職業是學生、科研人員或者醫生,我希望大家都忘掉自己本身的職業,從現在開始,你就是一名程式設計師(Coder)。只有忘卻自己的背景,才能全心投入,學習編程,學習R語言。R是用於統計分析、繪圖的語言和操作環境。
  • 如何用R語言畫出漂亮的盒形圖(上) 繽紛燦爛R語言 醫學方R語言高階課程
    R語言基礎繪圖包中的全真七子也是如此,內力深厚,但是中規中矩,能滿足你的要求,但是實在也玩不出什麼花樣。【一本R書走天涯】第四期:R語言掃地僧 | 醫學方R語言專題5.字符串的對與錯 |【一本R書走天涯】第五期 | 醫學R語言速成精品專題6.悄悄告訴你一個關於「因子」的故事 | 【一本R書走天涯】| R語言基礎課程7.R語言的金剛琢 |【一本R書走天涯】第七期| 醫學方R語言基礎課程8.「矩陣」革命!
  • 【培訓課程】科研繪圖·學術圖像專題培訓
    NSC金牌設計師,手把手教你如何從小白變大神!中科幻彩科研繪圖培訓擁有一支專業的講師團隊,包括中科幻彩設計總監、金牌設計師在內的主講老師畢業於北京大學、中科院化學所等,擁有物理化學生物等專業博士學位,師從中國科學院院士,發表Nat.Commun./Sci. Adv./Adv.
  • 超級乾貨 :手把手教你學習R語言(附資源連結)
    這套學習方法對於數據科學或R語言的初學者會很有用;如果讀者是R語言的老用戶,則會由本文了解這門語言的部分最新成果。R語言學習方法會幫助您快速、高效學習R語言。前言在開始學習之前,第一個要回答的問題是:為什麼要用R語言?或者R語言為何如此有用?
  • 科研萌新 | 科研繪圖軟體不完全盤點
    作為對於信息最直觀形象的傳達,圖的好壞直接影響到了信息表達的效果。因此在一篇論文的撰寫過程中,經常要將很大的精力投入到圖的製作和美化中。「工欲善其事,必先利其器」。在本期的「科研萌新」系列中,將盤點凝聚態物理領域中經常可以用到的幾款製圖軟體,簡要介紹各個軟體在不同方向的專長,大家可以挑選自己喜歡的進行學習使用。
  • 速領|手把手教你SPSS基本操作和臨床科研技巧
    SPSS 操作簡單,無需編程,功能強大;數據處理、統計分析、圖表製作都可以做,非常適合統計小白!如果能夠結合書本理論與臨床實踐操作練習,遇到問題能夠有專業的指導解決,一定能夠快速掌握統計分析。4.MedCalc介紹及其在Meta分析、診斷試驗的ROC分析、臨床檢驗數據一致性分析中的應用;5.SCI製圖的好手:Graphpad Prism介紹及統計繪圖。
  • 123.R簡介和統計繪圖
    R語言優勢統計分析能力突出,部分統計功能整合在R語言的底層,但大多數數據分析和可視化功能則以包(packages)的形式提供,資源極其豐富R具有強大的數據可視化能力,高質量的圖像輸出工具以及多種現代繪圖系統:如grid, lattice, ggplot2等擴展和開發能力,在R中可使用簡潔的方式編寫新的統計方法,甚至整合進其他語言編寫的應用程式內
  • 後天開講|9 晚掌握用 R 語言繪製出版級圖片,發高分文章必備!
    丁香園攜手十年以上生物信息工程師張旭東老師開展了本次《 R 語言與生物醫學出版級繪圖直播培訓班》。手把手帶你掌握利用 R 軟體如何繪製出出版級的圖片,助你發高分文章!R 語言去實現。
  • par函數詳解(下) 繽紛燦爛R語言 醫學方R語言高階課程
    「醫學方」由一批臨床醫師和科研人創立,始終致力於服務「醫學人」,將最前沿、最有價值的臨床、科研原創文章推送給各位臨床醫師、科研人員好了,par()函數的參數就介紹這麼多,基礎繪圖包的高級繪圖函數和低級繪圖函數大部分都會依賴於這個函數,因此我把它放在第一個進行講解。希望大家多多練習。下期我們開始介紹基礎繪圖包的全真七子!
  • R語言從入門到精通:Day1
    在正式開始之前,我想對看到這篇文章的你提出一個小小的要求:不管你的第一職業是學生、科研人員或者醫生,我希望大家都忘掉自己本身的職業,從現在開始,你就是一名程式設計師(Coder)。只有忘卻自己的背景,才能全心投入,學習編程,學習R語言。R是用於統計分析、繪圖的語言和操作環境。
  • 手把手教你作圖-ChemDraw超清晰繪圖教程合集!
    手把手教你作圖-ChemDraw超清晰繪圖教程合集PPT目錄:1. chemdraw-01-軟體使用簡介.PPT
  • 教您用R語言畫直方圖!| 繽紛燦爛R語言 | 醫學方R語言高階課程
    這三步是為了找到x軸的取值範圍plot(h1, ylim=c(hmin, hmax), col="green", xlim=c(xmin, xmax))lines(h2, col="blue")#注意,用低級繪圖函數
  • R語言完美重現STAMP結果圖
    畫圖的思路是首先分別繪製左右兩幅圖,之後再拼接在一起,因此需要首先構建繪製兩幅圖所需的繪圖文件。繪圖數據獲取對於左側的組間豐度均值比較條形圖,我們首先根據差異性檢驗的結果從原始的豐度數據文件中提取具有顯著差異的列,之後按照分組計算其組內平均豐度,再轉換成ggplot繪圖所用的長格式數據框。
  • MP科研繪圖|您身邊的專業繪圖工具
    然而,沒有合適的素材、繪圖軟體操作複雜等原因往往成為科研工作者們繪製配圖的絆腳石。為解決科研配圖繪製困難的問題,MedPeer研發出最適合生物醫學領域科研者的繪圖軟體,10萬+的矢量圖標、豐富全面的專業模板、簡便實用的作業系統帶給用戶全新的繪圖體驗。
  • 免費資源 | R語言可視化繪圖,讓你的SCI論文更加完美
    所以說如何讓圖形更完美的呈現在文章中,一直是所有科研人士探索的課題。今天小喵給大家分享的就是,R的另一個強大的功能——繪圖功能。其製圖有印刷的素質,也可加入數學符號。這次的視頻詳細介紹了R語言可視化繪圖的操作,希望大家看過之後能夠掌握這樣技能。