ggplot2 : 數(shù)據(jù)分析與圖
中譯本序
每當(dāng)我們看到一個(gè)新的軟件,第一反應(yīng)會(huì)是:為什么又要發(fā)明一個(gè)新軟件?ggplot2是R世界里相對(duì)還比較年輕的一個(gè)包,在它之前,官方R已經(jīng)有自己的基礎(chǔ)圖形系統(tǒng)(graphics包)和網(wǎng)格圖形系統(tǒng)(grid包),并且Deepayan Sarkar也開(kāi)發(fā)了lattice包,看起來(lái)R的世界對(duì)圖形的支持已經(jīng)足夠強(qiáng)大了。那么我們不禁要問(wèn),為什么還要發(fā)明一套新的系統(tǒng)?
設(shè)計(jì)理念
打個(gè)比方,想想我們小時(shí)候怎樣學(xué)中文的。最開(kāi)始的時(shí)候我們要識(shí)字,不認(rèn)識(shí)字就沒(méi)法閱讀和寫(xiě)作,但我們并不是一直按照一個(gè)個(gè)漢字學(xué)習(xí)的,而是通過(guò)句子和具體的場(chǎng)景故事學(xué)習(xí)的。為什么不在小學(xué)時(shí)背六年字典呢?那樣可能認(rèn)識(shí)所有的漢字。原因很簡(jiǎn)單,光有單字,我們不會(huì)說(shuō)話,也無(wú)法閱讀和寫(xiě)作。缺的是什么?答案是對(duì)文字的組織能力,或者說(shuō)語(yǔ)法。
R的基礎(chǔ)圖形系統(tǒng)基本上是一個(gè)“紙筆模型”,即:一塊畫(huà)布擺在面前,...
中譯本序
每當(dāng)我們看到一個(gè)新的軟件,第一反應(yīng)會(huì)是:為什么又要發(fā)明一個(gè)新軟件?ggplot2是R世界里相對(duì)還比較年輕的一個(gè)包,在它之前,官方R已經(jīng)有自己的基礎(chǔ)圖形系統(tǒng)(graphics包)和網(wǎng)格圖形系統(tǒng)(grid包),并且Deepayan Sarkar也開(kāi)發(fā)了lattice包,看起來(lái)R的世界對(duì)圖形的支持已經(jīng)足夠強(qiáng)大了。那么我們不禁要問(wèn),為什么還要發(fā)明一套新的系統(tǒng)?
設(shè)計(jì)理念
打個(gè)比方,想想我們小時(shí)候怎樣學(xué)中文的。最開(kāi)始的時(shí)候我們要識(shí)字,不認(rèn)識(shí)字就沒(méi)法閱讀和寫(xiě)作,但我們并不是一直按照一個(gè)個(gè)漢字學(xué)習(xí)的,而是通過(guò)句子和具體的場(chǎng)景故事學(xué)習(xí)的。為什么不在小學(xué)時(shí)背六年字典呢?那樣可能認(rèn)識(shí)所有的漢字。原因很簡(jiǎn)單,光有單字,我們不會(huì)說(shuō)話,也無(wú)法閱讀和寫(xiě)作。缺的是什么?答案是對(duì)文字的組織能力,或者說(shuō)語(yǔ)法。
R的基礎(chǔ)圖形系統(tǒng)基本上是一個(gè)“紙筆模型”,即:一塊畫(huà)布擺在面前,你可以在這里畫(huà)幾個(gè)點(diǎn),在那里畫(huà)幾條線,指哪兒畫(huà)哪兒。后來(lái)lattice包的出現(xiàn)稍微改善了這種情況,你可以說(shuō),我要畫(huà)散點(diǎn)圖或直方圖,并且按照某個(gè)分類(lèi)變量給圖中的元素上色,此時(shí)數(shù)據(jù)才在畫(huà)圖中扮演了一定的中心角色,我們不用去想具體這個(gè)點(diǎn)要用什么顏色(顏色會(huì)根據(jù)變量自動(dòng)生成)。然而,lattice繼承了R語(yǔ)言的一個(gè)糟糕特征,就是參數(shù)設(shè)置鋪天蓋地,足以讓人窒息,光是一份xyplot()函數(shù)的幫助文檔,恐怕就夠我們消磨一天時(shí)間了,更重要的是,lattice仍然面向特定的統(tǒng)計(jì)圖形,像基礎(chǔ)圖形系統(tǒng)一樣,有直方圖、箱線圖、條形圖等等,它沒(méi)有一套可以讓數(shù)據(jù)分析者說(shuō)話的語(yǔ)法。
那么數(shù)據(jù)分析者是怎樣說(shuō)話的呢?他們從來(lái)不會(huì)說(shuō)這條線用#FE09BE顏色,那個(gè)點(diǎn)用三角形狀,他們只會(huì)說(shuō),把圖中的線用數(shù)據(jù)中的職業(yè)類(lèi)型變量上色,或圖中點(diǎn)的形狀對(duì)應(yīng)性別變量。有時(shí)候他們畫(huà)了一幅散點(diǎn)圖,但馬上他們發(fā)現(xiàn)這幅圖太擁擠,最好是能具體看一下里面不同收入階層的特征,所以他們會(huì)說(shuō),把這幅圖拆成七幅小圖,每幅圖對(duì)應(yīng)一個(gè)收入階層。然后發(fā)現(xiàn)散點(diǎn)圖的趨勢(shì)不明顯,最好加上回歸直線,看看回歸模型反映的趨勢(shì)是什么,或者發(fā)現(xiàn)圖中離群點(diǎn)太多,最好做一下對(duì)數(shù)變換,減少大數(shù)值對(duì)圖形的主導(dǎo)性。
從始至終,數(shù)據(jù)分析者都在數(shù)據(jù)層面上思考問(wèn)題,而不是拿著水彩筆和調(diào)色板在那里一筆一劃作圖,而計(jì)算機(jī)程序員則傾向于畫(huà)點(diǎn)畫(huà)線。Leland Wilkinson的著作在理論上改善了這種狀況,他提出了一套圖形語(yǔ)法,讓我們?cè)诳紤]如何構(gòu)建一幅圖形的時(shí)候不再陷在具體的圖形元素里面,而是把圖形拆分為一些互相獨(dú)立并且可以自由組合的成分。這套語(yǔ)法提出來(lái)之后他自己也做了一套軟件,但顯然這套軟件沒(méi)有被廣泛采用;幸運(yùn)的是,Hadley Wickham在R語(yǔ)言中把這套想法巧妙地實(shí)現(xiàn)了。
為了說(shuō)明這種語(yǔ)法的想法,我們考慮圖形中的一個(gè)成分:坐標(biāo)系。常見(jiàn)的坐標(biāo)系有兩種:笛卡爾坐標(biāo)系和極坐標(biāo)系。在語(yǔ)法中,它們屬于一個(gè)成分,可自由拆卸替換。笛卡爾坐標(biāo)系下的條形圖實(shí)際上可以對(duì)應(yīng)極坐標(biāo)系下的餅圖,因?yàn)闂l形圖的高可以對(duì)應(yīng)餅圖的角度,本質(zhì)上沒(méi)什么區(qū)別。因此在ggplot2中,從一幅條形圖過(guò)渡到餅圖,只需要加極少量的代碼,把坐標(biāo)系換一下就可以了。如果我們用紙筆模型,則可以想象,這完全是不同的兩幅圖,一幅圖里面要畫(huà)的是矩形,另一幅圖要畫(huà)扇形。
更多的細(xì)節(jié)在本書(shū)中會(huì)介紹,這里我們只是簡(jiǎn)略說(shuō)明用語(yǔ)法畫(huà)圖對(duì)用紙筆畫(huà)圖來(lái)說(shuō)在思維上的優(yōu)越性;前者是說(shuō)話,后者是說(shuō)字。
發(fā)展歷程
ggplot2是Hadley在愛(ài)荷華州立大學(xué)博士期間的作品,也是他博士論文的主題之一,實(shí)際上ggplot2還有個(gè)前身ggplot,但后來(lái)廢棄了,某種程度上這也是Hadley寫(xiě)軟件的特征,熟悉他的人就知道這不是他第一個(gè)“2”版本的包了(還有reshape2)。帶2的包和原來(lái)的包在語(yǔ)法上會(huì)有很大的改動(dòng),基本上不兼容。盡管如此,他的R代碼風(fēng)格在R社區(qū)可謂獨(dú)樹(shù)一幟,尤其是他的代碼結(jié)構(gòu)很好,可讀性很高,ggplot2是R代碼抽象的一個(gè)杰作。讀者若感興趣,可以在GitHub網(wǎng)站上瀏覽他的包:https://github.com/hadley。在用法方面,ggplot2也開(kāi)創(chuàng)了一種奇特而絕妙的語(yǔ)法,那就是加號(hào):一幅圖形從背后的設(shè)計(jì)來(lái)說(shuō),是若干圖形語(yǔ)法的疊加,從外在的代碼來(lái)看,也是若干R對(duì)象的相加。這一點(diǎn)精妙盡管只是ggplot2系統(tǒng)的很小一部分,但我個(gè)人認(rèn)為沒(méi)有任何程序語(yǔ)言可比擬,它對(duì)作為泛型函數(shù)的加號(hào)的擴(kuò)展只能用兩個(gè)字形容:絕了。
至2013年2月26日,ggplot2的郵件列表(http://groups.google.com/group/ggplot2 )訂閱成員已達(dá)3394人,郵件總數(shù)為15185封,已經(jīng)成為一個(gè)豐富、活躍的用戶(hù)社區(qū)。未來(lái)ggplot2的發(fā)展也將越來(lái)越依賴(lài)于用戶(hù)的貢獻(xiàn),這也是很多開(kāi)源軟件最終的走向。
關(guān)于版本更新
原書(shū)面世之時(shí),ggplot2的版本號(hào)是0.8.3,譯者開(kāi)始翻譯此書(shū)時(shí)是0.9.0版本;該版本較之0.8.3,內(nèi)部做了一些大改動(dòng)。此后,ggplot2頻繁升級(jí),目前版本號(hào)是0.9.3,當(dāng)然這也給本書(shū)的翻譯過(guò)程帶來(lái)了相當(dāng)大的麻煩。因?yàn)樽g者不但要修正原書(shū)中大量過(guò)時(shí)的代碼、重新畫(huà)圖,還要修正過(guò)時(shí)的理念,以及處理數(shù)次版本更新的影響。所幸,在翻譯過(guò)程中,譯者得到了本書(shū)審校殷騰飛博士、ggplot2開(kāi)發(fā)者Hadley Wickham和Wistong Chang的大力幫助。
如果你是老用戶(hù),那么可能需要閱讀下面的小節(jié)。之后ggplot2有過(guò)多次更新,尤其是0.9.0之后,ggplot2的繪圖速度和幫助文檔有了質(zhì)的飛躍。關(guān)于0.9的更新,讀者可以從https://github.com/downloads/hadley/ggplot2/guide-col.pdf下載一份細(xì)致的說(shuō)明文檔,但原文檔比較長(zhǎng),而且有些內(nèi)部更新問(wèn)題我們也不一定需要了解,因此這里給一段概述。
ggplot2的幫助文檔大大擴(kuò)充了,過(guò)去頭疼的問(wèn)題之一就是一個(gè)函數(shù)里面不知道有哪些可能的參數(shù),例如theme()函數(shù),現(xiàn)在已經(jīng)有了詳細(xì)說(shuō)明。
新增圖例向?qū)Ш瘮?shù)guide_legend()和guide_colorbar(),前者可以用來(lái)指導(dǎo)圖例的排版,例如可以安排圖例中元素排為n行m列;后者增強(qiáng)了連續(xù)變量圖例的展示,例如當(dāng)我們把顏色映射到一個(gè)連續(xù)變量上時(shí),過(guò)去生成的圖例是離散的,現(xiàn)在可以用這個(gè)函數(shù)生成連續(xù)顏色的圖例(漸變色)。
新增幾何對(duì)象函數(shù)geom_map()(讓地圖語(yǔ)法變得更簡(jiǎn)單),geom_raster()(更高效的geom_tile()),geom_dotplot()(一維點(diǎn)圖,展示變量密度分布)和geom_violin()(小提琴,實(shí)為密度曲線)。
新增統(tǒng)計(jì)變換函數(shù)stat_summary2d()(在二維網(wǎng)格上計(jì)算數(shù)據(jù)密度),stat_summary_hex()(在六邊形“蜂巢”上計(jì)算數(shù)據(jù)密度),stat_bindot()(一維點(diǎn)圖密度),stat_ydensity()(密度曲線,用于小提琴圖)。
facet_grid()支持X軸和Y軸其中一者可以有自由的刻度(根據(jù)數(shù)據(jù)范圍而定),以往要么所有切片使用同樣的坐標(biāo)軸刻度,要么所有都自由。
geom_boxplot()開(kāi)始支持畫(huà)箱線圖的凹槽(notch),就像R基礎(chǔ)圖形系統(tǒng)中的boxplot()函數(shù)。
新增函數(shù)ggmissing()用來(lái)展示缺失值的分布,ggorder()按照數(shù)據(jù)觀察順序先后畫(huà)折線圖,ggstructure()展示數(shù)據(jù)熱圖。
另外這次更新涉及到一些函數(shù)參數(shù)名稱(chēng)的變化,如果舊代碼在這個(gè)版本中報(bào)錯(cuò)說(shuō)有未使用的參數(shù),那么用戶(hù)需要再次查看幫助文檔,確保輸入的參數(shù)在函數(shù)中存在。在所有這些表面的更新背后,實(shí)際上ggplot2很大程度上被重寫(xiě)了,例如開(kāi)始使用R自帶的S3泛型函數(shù)設(shè)計(jì),以及將過(guò)去ggplot2的功能繼續(xù)模塊化為一些獨(dú)立的包,一個(gè)典型的例子就是標(biāo)度部分的功能被抽象到scales包中,從數(shù)據(jù)映射到顏色、大小等外觀屬性可以由這個(gè)包直接完成。這種分拆也使得其他開(kāi)發(fā)者可使用過(guò)去ggplot2內(nèi)部的一些功能函數(shù)。
0.9.1版本主要解決了0.9.0版本中的一些漏洞。ggplot2在2012年9月4日發(fā)布了新的版本0.9.2,其中一些特性和更新有必要提及:
采用了全新的主題(theme)系統(tǒng),opts()函數(shù)已被標(biāo)記為“不推薦使用”(deprecated),將在未來(lái)版本中被取消,取而代之的是theme()函數(shù),主題元素(theme element)由屬性列表構(gòu)成,支持繼承,主題之間可以直接進(jìn)行合并等操作。詳情參見(jiàn)wiki頁(yè)面:https://github.com/wch/ggplot2/wiki/New-theme-system 。
依賴(lài)于新的gtable包。 用來(lái)更方便地調(diào)整修改ggplot2圖形中的圖元,ggplotGrob()會(huì)返回一個(gè)gtable類(lèi),這個(gè)對(duì)象可以利用gtable包中提供的函數(shù)和接口進(jìn)行操作。
所有“模板”類(lèi)型的圖形函數(shù),比如plotmatrix(),ggorder()等等,已被標(biāo)記為“不推薦使用”(deprecated),將在未來(lái)版本中取消。
在本書(shū)出版之際,ggplot2更新到了版本0.9.3,修復(fù)了0.9.2的一些漏洞,其主要更新包括
不再支持plotmatrix()函數(shù)。
geom_polygon()提速,比如世界地圖的繪制快了12倍左右。
新增部分主題,比如theme_minimal(),theme_classic()。
本書(shū)的所有代碼和圖片都是針對(duì)新版本0.9.3的,在內(nèi)容方面也根據(jù)版本更新對(duì)原文做了適當(dāng)?shù)脑鰟h填補(bǔ),以滿足讀者的需求。
本書(shū)把影響正文閱讀的彩圖集中放在附錄后面,讀者可以隨時(shí)翻閱。
致謝
在聽(tīng)說(shuō)我們翻譯完這本書(shū)之后,本書(shū)原著Hadley很高興,給我們發(fā)郵件說(shuō):
I am excited and honoured to have my book translated to Chinese. ggplot2 has become far more popular than I ever imagined, and I'm excited that this translation will allow many more people to learn ggplot2. I'm very grateful that Yihui and his team of translators (Nan Xiao, Tao Gao, Yixuan Qiu, Weicheng Zhu, Taiyun Wei and Lanfeng Pan) made this possible.
One of the biggest improvements to ggplot2 since the book was first written is the ggplot2 mailing list. This is a very friendly environment where you can get help with your visualisations, and improve your own knowledge of ggplot2 by helping others solve their problems. I'd strongly encourage you to join the mailing list, even if you think your English is not very good -- we are very friendly people.
我們感謝這本書(shū)的譯者,包括邱怡軒(第1~2章)、主偉呈(第3~4章)、肖楠(第5~6章)、高濤(第7~8章)、潘嵐鋒(第9章)、魏太云(第10章、附錄以及翻譯過(guò)程的協(xié)調(diào)安排和全書(shū)的LaTeX排版工作)。所有譯者均來(lái)自于統(tǒng)計(jì)之都(http://cos.name )。
愛(ài)荷華州立大學(xué)的殷騰飛博士、中國(guó)人民大學(xué)統(tǒng)計(jì)學(xué)院的孟生旺教授、浙江大學(xué)的張政同學(xué)通讀了譯稿,提出了很多有用的建議,殷騰飛博士還提供了大多數(shù)新版本中的解決方案,并擔(dān)任本書(shū)的審校。肖凱老師和余光創(chuàng)博士分別對(duì)第1~4章、第8~10章以及附錄提出了很多修改意見(jiàn),此外,中國(guó)人民大學(xué)的陳妍、李曉矛、謝漫锜三位同學(xué)、中國(guó)再保險(xiǎn)公司的李皞先生、百度公司的韓帥先生、eBay公司的陳麗云女士、Mango Solutions公司的李艦先生、京東商城的劉思喆先生、首鋼總公司的鄧一碩先生、新華社的陳堰平先生在此書(shū)的翻譯過(guò)程中也曾提過(guò)不少寶貴的建議,在此一并表示感謝。
為了更好地服務(wù)社區(qū),我們還建立了翻譯主頁(yè):https://github.com/cosname/ggplot2-translation ,讀者可以在這里得到最新的勘誤和書(shū)中的代碼,也可以隨時(shí)提出任何問(wèn)題。
謝益輝
2013年2月26日
Hadley Wickham,RStudio 首席科學(xué)家,美國(guó)萊斯大學(xué)統(tǒng)計(jì)學(xué)助理教授,畢業(yè)于愛(ài)荷華州立大學(xué)統(tǒng)計(jì)系。Hadley 是R社區(qū)最活躍的人之一,代碼風(fēng)格獨(dú)樹(shù)一幟,致力于開(kāi)發(fā)用于數(shù)據(jù)處理、分析、成像的工具,截至2012年已開(kāi)發(fā)了超過(guò)30個(gè)高質(zhì)量的R軟件包,比如ggplot2、lubridate、plyr、reshape2、stringr、httr 等。
