ggplot2 函數學習
Public Library of Bioinformatics 學習內容來自於以上網址
因為ggplot2函數不是R語言自帶的,所以首先要安裝
首先製作一份散點圖:
幾何對象
在上面的例子中,各種屬性映射由ggplot函數執行,只需要加一個圖層,使用geom_point()告訴ggplot要畫散點,於是所有的屬性都映射到散點上
geom_point()完成的就是幾何對象的映射,ggplot2提供提供了各種幾何對象的映射,如geom_histogram用於直方圖,geom_bar用於畫柱狀圖,geom_boxplot用於畫箱式圖等等。
不同的幾何對象,要求的屬性會有些不同,這些屬性也可以在幾何對象映射時提供,比如上一圖,也可以用以下語法來畫
ggplot2支持圖層,我們通常把不同的圖層中共用的映射提供給ggplot函數,而某一幾何對象才需要的映射參數提供給geom_xxx函數
這一小節我們來看一下各種常用的幾何對象
直方圖
直方圖最容易,提供一個x變數,畫出數據的分布。
同樣可以根據另外的變數給它填充顏色,比如按不同的切工:
也可以將其分開,side-by-side地畫直方圖
還可以使用position=「fill」,按照相對比例來畫
柱狀圖
柱狀圖非常適合於畫分類變數。在這裡以透明度變數為例。按照不同透明度的鑽石的數目畫柱狀圖
柱狀圖兩個要素,一個是分類變數,一個是數目,也就是柱子的高度。數目在這裡不用提供,因為ggplot2會通過x變數計算各個分類的數目
當然你想提供也是可以的,通過stat參數,可以讓geom_bar按指定高度畫圖,比如以下代碼:
柱狀圖和直方圖是很像的,直方圖把連續的數據按照一個個等長的區分(bin)來區分,然後計數,畫柱狀圖。而柱狀圖是分類數據,按類別計數。我們可以用前面的直方圖的參數來畫side-by-side的柱狀圖,填充顏色或者按比例畫圖,它們是高度一致的
柱狀圖是用來表示計數數據的,但在生物界卻經常拿來表示均值,加上誤差來表示數據分布,這可以通過圖層來實現。
密度函數圖
說到直方圖,就不得不說密度函數圖,數據和映射與直方圖是一樣的,唯一不同的是幾何對象,geom_histogram告訴ggplot要畫直方圖,而geom_density則說我們要畫密度函數圖,在我們熟悉前面語法的情況下,很容易畫出:
colour參數指定的是曲線的顏色,而fill是往曲線下面填充顏色。
箱式圖
數據量比較大的時候,用直方圖和密度函數圖是表示數據的好方法,而在數據量比較少的時候,比如很多生物實驗,很多時候大家使用柱狀圖+errorbar的形式來表示,不過這種方法的信息量非常低,被Nature Methods吐槽,這種情況推薦使用boxplot
geom_boxplot將數據映射到箱式圖上,上面的代碼,我們應該很熟悉了,按切工的分類,對價格變數畫箱式圖,再分開按照color變數填充顏色。
ggplot2提供了很多的geom_xxx函數,可以滿足我們對各種圖形繪製的要求
geom_abline geom_area
geom_bar geom_bin2d
geom_blank geom_boxplot
geom_contour geom_crossbar
geom_density geom_density2d
geom_dotplot geom_errorbar
geom_errorbarh geom_freqpoly
geom_hex geom_histogram
geom_hline geom_jitter
geom_line geom_linerange
geom_map geom_path
geom_point geom_pointrange
geom_polygon geom_quantile
geom_raster geom_rect
geom_ribbon geom_rug
geom_segment geom_smooth
geom_step geom_text
geom_tile geom_violin
geom_vline
4.標尺(scale)
前面我們已經看到了,畫圖就是在做映射,不管是映射到不同的幾何對象上,還是映射各種圖形屬性。這一小節介紹標尺,在對圖形屬性進行映射之後,使用標尺可以控制這些屬性的顯示方式,比如坐標刻度,可能通過標尺,將坐標進行對數變換;比如顏色屬性,也可以通過標尺,進行改變
以數據(data)和映射(Mapping)一節中所畫散點圖為例,將y軸坐標進行log10變換,再自己定義顏色為彩虹色。
5、 統計變換(statistics)
統計變換對原始數據進行某種計算,然後在圖上表示出來,例如對散點圖加上一條回歸線。
這裡就不按顏色、切工來分了,不然ggplot會按不同的分類變數分別做回歸,圖就很亂,如果我們需要這樣做,我們可以使用分面,這個將在後面介紹。
這裡,aes所提供的參數,就通過ggplot提供,而不是提供給geom_point,因為ggplot里的參數,相當於全局變數,geom_point()和stat_smooth()都知道x,y的映射,如果只提供給geom_point(),則相當於是局部變數,geom_point知道這種映射,而stat_smooth不知道,當然你再給stat_smooth也提供x,y的映射,不過共用的映射,還是提供給ggplot好。
ggplot2提供了多種統計變換方式:1stat_abline stat_contour stat_identity stat_summary
2stat_bin stat_density stat_qq stat_summary2d
3stat_bin2d stat_density2d stat_quantile stat_summary_hex
4stat_bindot stat_ecdf stat_smooth stat_unique
5stat_binhex stat_function stat_spoke stat_vline
6stat_boxplot stat_hline stat_sum stat_ydensity
統計變換是非常重要的功能,我們可以自己寫函數,基於原始數據做某種計算,並在圖上表現出來,也可以通過它改變geom_xxx函數畫圖的默認統計參數。
比如我在Proteomic investigation of the interactome of FMNL1 in hematopoietic cells unveils a role in calcium-dependent membrane plasticity的圖一中,就把boxplot的中位線替換成了平均值來作圖。
6、坐標系統(Coordinante)
坐標系統控制坐標軸,可以進行變換,例如XY軸翻轉,笛卡爾坐標和極坐標轉換,以滿足我們的各種需求。
坐標軸翻轉由coord_flip()實現
而轉換成極坐標可以由coord_polar()實現:
這也是為什麼之前介紹常用圖形畫法時沒有提及餅圖的原因,餅圖實際上就是柱狀圖,只不過是使用極坐標而已,柱狀圖的高度,對應於餅圖的弧度,餅圖並不推薦,因為人類的眼睛比較弧度的能力比不上比較高度(柱狀圖)
還可以畫靶心圖:
以及風玫瑰圖(windrose)
7、圖層(Layer)
photoshop流行的原因在於PS 3.0時引入圖層的概念,ggplot的牛B之處在於使用+號來疊加圖層,這堪稱是泛型編程的典範。
在前面散點圖上,我們已經見識過,加上了一個回歸線擬合的圖層。有了圖層的概念,使用ggplot畫起圖來,就更加得心應手。
做為圖層的一個很好的例子是蝙蝠俠logo,batman logo由6個函數組成,在下面的例子中,我先畫第一個函數,之後再加一個圖層畫第二個函數,不斷重複這一過程,直到六個函數全部畫好。
require(ggplot2)
02f1data.frame(x=x,y=y)
03 d -3*sqrt(33)/7,]
04 return(d)
05}
06
07x1data.frame(x2=x2, y2=y2)
08p2data.frame(x3=x3, y3=y3)
09p3data.frame(x4=x4,y4=y4)
10p4data.frame(x5=x5,y5=y5)
11p5data.frame(x6=x6,y6=y6)
12p6
下面再以生物界中常用的柱狀圖+誤差圖為實例,展示ggplot2非常靈活的圖層。以我2011年發表的文章Phosphoproteome profile of human lung cancer cell line A549中的westernblot數據為例。
1Normaldata.frame(V=c("Normal", "Cancer"), mean=m, sd=s)
2d$V
8、分面(Facet)
分面可以讓我們按照某種給定的條件,對數據進行分組,然後分別畫圖。
在統計變換一節中,提到如果按切工分組作回歸線,顯然圖會很亂,有了分面功能,我們可以分別作圖。
9、主題(Theme)
通過ggplot畫圖之後,我們可能還需要對圖進行定製,像title, xlab, ylab這些高頻需要用到的,自不用說,ggplot2提供了ggtitle(), xlab()和ylab()來實現。
比如:
但是這個遠遠滿足不了需求,我們需要改變字體,字體大小,坐標軸,背景等各種元素,這需要通過theme()函數來完成。
ggplot2提供一些已經寫好的主題,比如theme_grey()為默認主題,我經常用的theme_bw()為白色背景的主題,還有theme_classic()主題,和R的基礎畫圖函數較像。
別外ggthemes包提供了一些主題可供使用,包括:
1theme_economist theme_economist_white
2theme_wsj theme_excel
3theme_few theme_foundation
4theme_igray theme_solarized
5theme_stata theme_tufte
在2013年發表的文章Putative cobalt- and nickel-binding proteins and motifs in Streptococcus pneumoniae中的圖3就是使用theme_stata來畫的。
至於如何改變這些元素,我覺得我之前畫囧字的博文可以做為例子:
10.二維密度圖
在這個文檔里,為了作圖方便,我們使用diamonds數據集的一個子集,如果使用全集,數據量太大,畫出來散點就糊了,這種情況可以使用二維密度力來呈現。
11、ggplot2實戰
果殼知性里有帖子介紹了個猥瑣邪惡的曲線,引來無數宅男用各種工具來畫圖,甚至於3D動態圖都出來了。這裡用ggplot2來畫。3D版本請猛擊此處。
1fdata.frame(x=c(x1,x2,x3), y=rep(y,3), type=rep(LETTERS[1:3], each=length(y)))
2p
再來一個蝴蝶圖,詳見《Modern Applied Statistics with S-PLUS》第一章。
1theta data.frame(x=radius*sin(theta), y=radius*cos(theta))
2 ggplot(dd, aes(x, y))+geom_path()+theme_null()+xlab("")+ylab("")
https://upload.plob.ybzhao.com/wp-content/uploads/2014/05/ggplot2_fig25.png
推薦閱讀:
※Apache kylin的基礎運維
※無人機數據收集、存儲以及深度挖掘
※穿越夾縫,走向卓越
TAG:大数据分析 |