小夥伴們大家吼哇!終於迎來了R語言繪圖專欄的第四次更新的放送,大家是不是有一點饑渴難耐…迫不及待了呢~上一次課程中我們主要介紹了ggplot2包的繪圖原理,理解了映射的概念,用散點圖來展示了數據。但是光會畫散點圖並不能算掌握了數據可視化的核心競爭力,畢竟我們沒看見過一片sci文章中只有寥寥幾張散點圖……或許存在這樣的神仙文章,但這並不能成為優秀的小夥伴們的追求。好了,那麼這一次的課程tkvillage就為大家帶來利用ggplot2包繪製條形圖的方法。
geom_bar函數 作為條形圖,最主要的就是要反映離散型數據的分布,讓讀者直觀地看到哪一組數據的數量多/佔有的比例大,兩組數據之間的差異如何。(當然兩組數據之間有沒有差異必須是經過統計學檢驗才能說了算的)geom_bar這個函數的幫助文檔長這個樣子:
我們來介紹幾個常用的參數:
a. stat:stat默認值是『count』也就是數據的頻數,即個數。它可以對數據進行統計變換,如果換成prop就是百分比。
b. position:就是條形圖堆放的方式,可以選擇:『dodge』,『fill』,『identtity』,『jitter』,『stack』。這五種方式分別對應為:並列放置、堆疊圖形元素並標準化高度,和為1、不作任何調整,添加擾動、堆棧放置。
c. width:不用多說,就是柱子的寬度。
下面讓我們利用ggplot2包的內置mpg數據集來畫一張最簡單的條形圖:
Mpg數據集中class這一列是分類型變量。
g_1<- ggplot(data = mpg, aes(manufacturer))+geom_bar()
g_1
這張最簡單的條形圖對於mpg數據集中class這一個變量進行了頻數的展示,告訴了我們每一種分類的汽車有多少個。
然而,在更多情況下,我們其實並不是要做頻數統計這件事情,而是需要利用條形圖繪製出分類變量中其他變量的數值,不要慌,這肯定是可以實現的。
dtx <- data.frame(label = LETTERS[1:5], mean = sample(70:100, 5), sd = sample(1:10,
5))
View(dtx)
p <- ggplot(dtx, aes(x = label, y = mean, ymin = mean - sd, ymax = mean + sd)) +
theme_bw()
p <- p + geom_bar(stat = "identity", width = 0.6, fill = "gray", color ="black") +
geom_errorbar(width = 0.3)
p
p + scale_y_continuous(expand = c(0, 0)) + geom_blank(aes(y = (mean + sd) *1.1))
通過以上代碼我們可以看到若想直接讓y軸展示每組變量的數值,我們需要先計算出來每組變量的平均值,和標準差,然後把他們作為畫圖的元素,所以常常需要我們自行處理、計算原始數據,生成新的數據框,方便我們自己畫圖。
第九行的代碼就是調節y坐標軸的範圍,從而讓圖片每個柱子對到y軸的0刻度水平上面。
2.展示多個變量的條形圖
當一張條形圖當中需要展示多個統計信息時,就需要將兩個分類變量統一到一張條形圖當中。那麼這張條形圖必定不會以單一的條形柱子來呈現。
當汽車的class和trans都屬於分類型變量的時候,就需要用分組型條形圖(一種比較簡單的聚類圖)來展現數據。按照上面的代碼,就可以畫出以下的圖片:
可以直觀地展現出來各種類型汽車當中,手動擋還是自動擋的車型比較多。
3.對圖形設置顏色
由於這幾張圖的顏色著實有些浮誇,我們可以自己動手,來調整圖形的顏色。
可以用scale_fill_brewer()這個標量函數:
是不是看著稍微好一些了。。要想生活過得去,總得頭上帶點綠。還是可以比較容易看得出來在suv汽車中,自動擋的汽車比較多,在compact緊湊級轎車中,手動擋m5的汽車比較多~沒辦法,經濟基礎決定上層建築啊。。。
一個彩蛋設置error_bar
啥是error_bar? 簡單來說就是誤差線,一般會以每組數據的平均值±標準差se的形式展現在每個柱子上面,只要畫條形圖,我們就繞不開error_bar這個事情,在ggplot包中,我們可以利用geom_bar()這個函數來進行error_bar的設定。可以看出來,error_bar在ggplot包中也被認為是一種映射對象。所以它值得擁有一個專門的函數來把它畫到畫布之上~
以上四個函數能實現的功能就是在提供x軸數據、y坐標數據的max和min值得情況下繪製不同形態的垂直線段,用來展示誤差線。
cycles<- c(rep('G1',3),rep('S',3),rep('G2',3),rep('M',3),
rep('G1',3),rep('S',3),rep('G2',3),rep('M',3))
condition<- c(rep('control',12),rep('treat',12))
value<- c(sample(70:80,3),sample(10:16,3),sample(20:30,3),sample(1:9,3),
sample(10:20,3),sample(2:10,3),sample(70:80,3),sample(20:30,3))
mydat1<- data.frame(cycles,condition,value)
ggplot(data = mydat1,aes(condition,value,fill=cycles))+
geom_bar(stat = 'identity',position = position_dodge(),width = 0.5)+
scale_fill_brewer(type = 'qual', palette = 7)+
labs(x = '',y = 'Cell cycle percentage', title = '')+
geom_errorbar(aes(ymax=value+se,ymin=value-se),
position=position_dodge(0.5),width=0.15,color='black')+
theme_light()
這裡我們用的是自己編的數據集,模擬了實驗對照組和加藥處理組細胞周期的變化,可以用如上這種分組條形圖展示出來,可以看出來藥物處理組的G2期細胞比率要明顯高於對照組,對照組的細胞主要在G1期,所以用藥物處理細胞可能會引起細胞阻滯在G2周期。當然這是我們假想的數據,具體情況需要自己做流失細胞術,分析自己的實驗數據。一般要做三組的平行重複~這樣error bar會展示出來組內三個重複數據之間的的差別,從而讓文章讀者看到實驗結果的穩定性。
一個後記
一百年前,1919年1月18日,一戰戰勝國在巴黎召開「和平會議」。中國派出代表團,以戰勝國身份參加和會,提出取消列強在華的各項特權,取消日本帝國主義與袁世凱訂立的「二十一條」等不平等條約,歸還大戰期間日本從德國手中奪去的山東各項權利等要求。巴黎和會在帝國主義列強操縱下,不但拒絕中國的要求,而且在對德合約上,明文規定把德國在山東的特權,全部轉讓給日本。北洋政府竟準備在「對德和約」上簽字,激起廣大愛國青年學生的「五四運動」,亦稱為「五四風雷」,其標誌了舊民主主義革命和新民主主義革命的分水嶺。
百年風雨過後,2019年5月4日,當今中國的面貌已經煥然一新,已從百年前的積貧積弱、千瘡百孔中復甦並漸漸崛起。此過程,離不開無數先輩們的無畏犧牲和無私奉獻;他們(在不同的領域,默默無聞但無比堅定)付出自己的汗水、智慧,放棄個人前途、名利,甚至犧牲了家庭的幸福,為的是國家的發展和進步,這其中或許就包括了你我的祖輩、父輩。
現今的中國,距離真正的富強仍有一段路要走,作為剛進入社會的萬千青年人之一,十分感激各位老師和前輩們的無私傳授,也逐漸明白了我們肩上的責任;五四運動中以暴力反對反動政治只是表象,這個時代的年輕人或許對』個人奮鬥『與「家國情懷」之間的關係有著不同的理解,但「愛國、進步、民主、科學」的五四精神根植於一代又一代中國青年思想當中。祝願各位在各自的專業領域中,能找到自己努力的方向,有所堅持。