標籤:

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("")

upload.plob.ybzhao.com/


推薦閱讀:

Apache kylin的基礎運維
無人機數據收集、存儲以及深度挖掘
穿越夾縫,走向卓越

TAG:大数据分析 |