ggplot2的作圖一般步驟為:
準(zhǔn)備數(shù)據(jù)甘苍,一般為數(shù)據(jù)框贵涵, 且一般為長表痴荐, 即每個(gè)觀測時(shí)間占一行血柳, 每個(gè)觀測變量占一列。
將數(shù)據(jù)輸入到ggplot()函數(shù)中蹬昌, 并指定參與作圖的每個(gè)變量分別映射到哪些圖形特性混驰, 比如映射為x坐標(biāo)、y坐標(biāo)皂贩、顏色栖榨、形狀等。這些映射稱為aesthetic mappings或aesthetics明刷。
選擇一個(gè)合適的圖形類型婴栽, 函數(shù)名以geom_開頭, 如geom_point()表示散點(diǎn)圖辈末。圖形類型簡稱為geom愚争。將ggplot()部分與geom_xxx()部分用加號連接映皆。到此已經(jīng)可以作圖,下面的步驟是進(jìn)一步的細(xì)化設(shè)定轰枝。
設(shè)定適當(dāng)?shù)淖鴺?biāo)系統(tǒng)捅彻, 如coord_cartesian(),?scale_x_log10()等。仍用加號連接鞍陨。
設(shè)定標(biāo)題和圖例位置等步淹,如labs()。仍用加號連接诚撵。
這個(gè)流程的一個(gè)大致的模板為:
p <- ggplot(data=<輸入數(shù)據(jù)框>,mapping=aes(<維度>=<變量名>,<維度>=<變量名>,<...>))p + geom_<圖形類型>(<...>) +scale_<映射>_<類型>(<...>) +coord_<類型>(<...>) +labs(<...>)
其中<...>表示額外的選項(xiàng)缭裆。變量p包含做出的圖形的所有數(shù)據(jù)與設(shè)定, 變量名可以任意取寿烟。
一澈驼、散點(diǎn)圖
數(shù)據(jù)選用gapminder包中和socviz包中的數(shù)據(jù)集。
install.packages('gapminder')library(gapminder)head(gapminder,20)
# A tibble: 20 x 6countrycontinent? year lifeExp? ? ? pop gdpPercap<fct><fct>? ? <int>? <dbl>? ? <int>? ? <dbl>1Afghanistan Asia? ? ? 1952? ? 28.8? 8425333? ? ? 779.2Afghanistan Asia? ? ? 1957? ? 30.3? 9240934? ? ? 821.3Afghanistan Asia? ? ? 1962? ? 32.0 10267083? ? ? 853.4Afghanistan Asia? ? ? 1967? ? 34.0 11537966? ? ? 836.5Afghanistan Asia? ? ? 1972? ? 36.1 13079460? ? ? 740.6Afghanistan Asia? ? ? 1977? ? 38.4 14880372? ? ? 786.7Afghanistan Asia? ? ? 1982? ? 39.9 12881816? ? ? 978.8Afghanistan Asia? ? ? 1987? ? 40.8 13867957? ? ? 852.9Afghanistan Asia? ? ? 1992? ? 41.7 16317921? ? ? 649.10Afghanistan Asia? ? ? 1997? ? 41.8 22227415? ? ? 635.11Afghanistan Asia? ? ? 2002? ? 42.1 25268405? ? ? 727.12Afghanistan Asia? ? ? 2007? ? 43.8 31889923? ? ? 975.13Albania? ? Europe? ? 1952? ? 55.2? 1282697? ? 1601.14Albania? ? Europe? ? 1957? ? 59.3? 1476505? ? 1942.15Albania? ? Europe? ? 1962? ? 64.8? 1728137? ? 2313.16Albania? ? Europe? ? 1967? ? 66.2? 1984060? ? 2760.17Albania? ? Europe? ? 1972? ? 67.7? 2263554? ? 3313.18Albania? ? Europe? ? 1977? ? 68.9? 2509048? ? 3533.19Albania? ? Europe? ? 1982? ? 70.4? 2780097? ? 3631.20Albania? ? Europe? ? 1987? ? 72? ? 3075321? ? 3739.
socviz的數(shù)據(jù)集需要從github上下載
devtools::install_github("kjhealy/socviz")
如果連接不上筛武,也可自行下載后使用下列命令安裝
devtools::install_local("本地路徑")
查看前20行數(shù)據(jù)
head(gss_sm, 20)
以gapminder數(shù)據(jù)集作為輸入數(shù)據(jù)缝其, 做出簡單的散點(diǎn)圖, 并逐步進(jìn)行改善畅铭。這個(gè)數(shù)據(jù)集有多個(gè)國家在多個(gè)年份的期望壽命與人均GDP值氏淑, 作期望壽命對人均GDP的散點(diǎn)圖, 每個(gè)國家的每個(gè)年份作為一個(gè)點(diǎn)硕噩。散點(diǎn)圖最重要的映射是x軸與y軸兩個(gè)維度假残。
首先調(diào)用ggplot()函數(shù), 指定數(shù)據(jù)集炉擅, 將人均GDP映射到x軸辉懒, 將期望壽命映射到y(tǒng)軸, 結(jié)果保存為一個(gè)R變量:
p<-ggplot(data=gapminder,mapping=aes(x=gdpPercap,y=lifeExp))
x谍失、y軸是最常見的映射眶俩, 也可以將變量映射為顏色、符號快鱼、線型等颠印, 這時(shí)不需要指定具體的顏色、符號抹竹、線型线罕, 而是將變量映射為這些圖形元素類型。
ggplot()的調(diào)用中窃判, 可以省略data =,?mapping =,?x =,?y =钞楼, 寫成:
p<- ggplot(gapminder, aes(gdpPercap, lifeExp))
在如上指定了數(shù)據(jù)和映射后, 只要用geom_xxx()指定一個(gè)圖形類型袄琳, 并與ggplot()的結(jié)果用加號連接就可以作圖了询件,如:
p+ geom_point()
實(shí)際上燃乍,上面的程序等同于調(diào)用print(p + geom_point())。在R函數(shù)中或者在循環(huán)中需要顯式地調(diào)用print()宛琅, 否則不會(huì)顯示結(jié)果刻蟹。當(dāng)載入了tidyverse系統(tǒng)時(shí)可以寫成(p + geom_point()) %>% print()。
指定數(shù)據(jù)集夯秃、指定映射座咆、選擇適當(dāng)?shù)膱D形類型就可以做出基本的圖形, 隨后可以逐步對坐標(biāo)系仓洼、坐標(biāo)系刻度、標(biāo)簽與圖例堤舒、配色等進(jìn)行改善色建。實(shí)際上,ggplot2包已經(jīng)提供了十分合理的預(yù)設(shè)值舌缤, 用戶只要進(jìn)行一些必要的改動(dòng)即可箕戳。
作圖步驟之間用加號連接,這是ggplot包特有的語法国撵。例如陵吸, 用相同的映射做出擬合曲線圖:
p+ geom_smooth()
##`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
用相同的映射做出散點(diǎn)圖并疊加擬合曲線圖:
p+ geom_point() + geom_smooth()
##`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
geom_smooth()的默認(rèn)設(shè)置調(diào)用了gam()函數(shù)來擬合曲線, 可以用geom_smooth()的參數(shù)選擇不同的擬合方法介牙, 如直線擬合:
p+ geom_point() + geom_smooth(method="lm")
##`geom_smooth()`using formula'y ~ x'
注意geom_xxx()函數(shù)計(jì)算所需的變量值是從ggplot()函數(shù)保存在變量p中的信息提取的壮虫。
在以上的所有圖形中, x軸變量(人均GDP)分布非正態(tài)环础,嚴(yán)重右偏囚似, 使得大多數(shù)散點(diǎn)重疊地分布在直角坐標(biāo)系的左下角。將x軸用對數(shù)刻度可以改善线得, 函數(shù)為scale_x_log10():
p+ geom_point() +geom_smooth(method="gam") +? scale_x_log10()
##`geom_smooth()`using formula'y ~ s(x, bs = "cs")'
scale_xxx()的labels選項(xiàng)指定如何標(biāo)出坐標(biāo)刻度數(shù)字饶唤, 參數(shù)值是一個(gè)函數(shù)對象, 如果scales包中找不到適當(dāng)?shù)墓δ埽?可以自定義一個(gè)函數(shù)將數(shù)值轉(zhuǎn)換為字符串贯钩。scales包提供了comma,?date,?dollar,?math,number,?ordinal,?pvalue,?scientific,time等坐標(biāo)刻度值轉(zhuǎn)換函數(shù)募狂。