title: "《ggplot2: 數(shù)據(jù)分析與圖形藝術(shù)》學(xué)習(xí)筆記1"
author: "wintryheart"
date: "2019年5月10日"
output:
html_document:
toc: TRUE
toc_float: TRUE
knitr::opts_chunk$set(echo = TRUE, warning = FALSE)
1趣效、圖形語(yǔ)法
一張統(tǒng)計(jì)圖形是從數(shù)據(jù)到幾何對(duì)象的圖形屬性的一個(gè)映射睁枕。此外雀摘,圖形中還可能包含數(shù)據(jù)的統(tǒng)計(jì)變換始衅,最后繪制在某個(gè)特定的坐標(biāo)系中摊唇,而分面則可以用來(lái)生成數(shù)據(jù)不同子集的圖形努潘。
一張統(tǒng)計(jì)圖形就是由上述這些獨(dú)立的圖形部件所組成的扛禽。
- 最基礎(chǔ)的部分是你想要可視化的數(shù)據(jù)(data)以及一系列將數(shù)據(jù)中的變量對(duì)應(yīng)到圖形屬性的映射(mapping)懂牧;
- 幾何對(duì)象(geom):在圖中實(shí)際看到的圖形元素侈净,如點(diǎn)、線僧凤、多邊形等畜侦;
- 統(tǒng)計(jì)變換(stats):對(duì)數(shù)據(jù)進(jìn)行的某種匯總,如分組計(jì)數(shù)躯保、線性回歸等旋膳。可選途事,但很有用验懊。
- 標(biāo)度(scale):將數(shù)據(jù)的取值映射到圖形空間,如用顏色尸变、大小或形狀來(lái)表示不同的取值义图,使讀者可以從圖形中讀取原始數(shù)據(jù)。展現(xiàn)方式為繪制圖例和坐標(biāo)軸召烂。
- 坐標(biāo)系(coord):描述數(shù)據(jù)是如何映射到圖形所在的平面碱工,同時(shí)提供看圖所需的坐標(biāo)軸和網(wǎng)絡(luò)線。通常使用笛卡爾坐標(biāo)系奏夫,但也可以變換為其他類型怕篷,如極坐標(biāo)和地圖投影。
- 分面(facet):描述如何將數(shù)據(jù)分解為各個(gè)子集酗昼,以及如何對(duì)子集作圖并聯(lián)合進(jìn)行展示廊谓。分面也稱為條件作圖或網(wǎng)格作圖。
2麻削、qplot(quick plot)快速作圖
主要學(xué)習(xí):
- qplot()的基本用法
- 數(shù)據(jù)和映射
- 圖形屬性(如顏色蹂析、大小和形狀)
- 幾何對(duì)象(如點(diǎn)、線碟婆、條形等))
- 分面(條件作圖)
- 外觀
2.2 數(shù)據(jù)集
ggplot2包中的diamonds數(shù)據(jù)集包含約54000顆鉆石的信息电抚,數(shù)據(jù)涵蓋:
-
鉆石質(zhì)量的四個(gè)C:
- 克拉重量(carat)
- 切工(cut)
- 顏色(color)
- 凈度(clarity)
-
五個(gè)物理指標(biāo)
- 深度(depth)
- 鉆面寬度(table)
- 其他測(cè)量尺度(x, y, z)
library(gridExtra) #支持ggplot2多圖并列
library(ggplot2)
data("diamonds")
head(diamonds)
這個(gè)數(shù)據(jù)集太大,我們?nèi)?00個(gè)隨機(jī)樣本來(lái)作圖展示竖共。
set.seed(1410) ##讓樣本可重復(fù)
dsmall <- diamonds[sample(nrow(diamonds),100),]
第一張圖
attach(diamonds)
p1 <- qplot(carat, price) #價(jià)格和重量之間的關(guān)系
p2 <- qplot(log(carat), log(price)) #變量變換
p3 <- qplot(carat,x*y*z) #變量組合,體積和重量之間關(guān)系
grid.arrange(p1,p2,p3, ncol=3)
detach(diamonds)
2.4 圖形屬性
attach(dsmall)
p4 <- qplot(carat, price, color=color) #將color變量映射到點(diǎn)的顏色
p5 <- qplot(carat, price, shape=cut) # 將cut變量映射到點(diǎn)的形狀
grid.arrange(p4,p5,ncol=2)
detach(dsmall)
不同類型的變量適合不同的圖形屬性:
- 顏色和形狀適合于分類變量蝙叛;
- 大小適合于連續(xù)變量;
- 數(shù)據(jù)量很大公给,不同組的數(shù)據(jù)之間很難區(qū)分借帘,適合于分面蜘渣。
2.5 幾何對(duì)象
適用于考察二維變量關(guān)系的幾何對(duì)象:
- geom="point",繪制散點(diǎn)圖肺然。
- geom="smooth"蔫缸,擬合一條平滑曲線,并將曲線和標(biāo)準(zhǔn)誤展示在圖中际起。
- geom="boxplot"拾碌,繪制箱形胡須圖,用以概括一系列點(diǎn)的分布情況街望。
- geom="path"和geom="line"可以在數(shù)據(jù)點(diǎn)之間繪制連線校翔。
- 路徑圖可以是任意的方向;
- 線條圖只能創(chuàng)建從左到右的連線灾前。
適用于考察一維變量分布的幾何對(duì)象:
對(duì)于連續(xù)變量:
- geom="histogram"防症, 繪制直方圖;
- geom="freqpoly"哎甲,繪制頻率多邊形蔫敲;
- geom="density",繪制密度曲線炭玫。
- qplot()默認(rèn)直方圖奈嘿。
對(duì)于離散變量:
- geom="bar",繪制條形圖础嫡。
2.5.1 平滑曲線
添加平滑曲線指么,展示數(shù)據(jù)趨勢(shì)酝惧。
p5 <- qplot(carat, price, data=dsmall, geom=c("point","smooth"))
#利用c()函數(shù)將多個(gè)幾何對(duì)象組成一個(gè)向量傳遞給geom榴鼎。幾何對(duì)象會(huì)按指定的順序進(jìn)行堆疊。
#如果不想繪制標(biāo)準(zhǔn)誤晚唇,可以使用se=FALSE巫财。
p6 <- qplot(carat, price, data=dsmall, geom=c("point", "smooth"), se=FALSE)
grid.arrange(p5, p6, ncol=2)
利用method參數(shù)可以選擇許多不同的平滑器:
- method="loess",當(dāng)n<1000時(shí)是默認(rèn)選項(xiàng)哩陕,使用的是局部回歸的方法平项。曲線的平滑程度由span參數(shù)控制,取值范圍為0(很不平滑)至1(很平滑)悍及。
qplot(carat, price, data=dsmall, geom=c("point","smooth"), span=0.2)
- method="gam", formula=y ~ s(x)闽瓢,調(diào)用mgcv包擬合一個(gè)廣義可加模型。這個(gè)模型與lm中的樣條模型類似心赶,但樣條的階數(shù)是通過(guò)數(shù)據(jù)得到的扣讼。如果n>1000,使用公式 formula = y ~ s(x, bs="cs")缨叫。
library(mgcv)
p7 <- qplot(carat, price, data=dsmall, geom=c("point","smooth"), method="gam", formula=y~s(x))
p8 <- qplot(carat, price, data=diamonds, geom=c("point","smooth"), method="gam", formula=y~s(x, bs="cs"))
grid.arrange(p7, p8, ncol=2)
- method="lm"椭符,默認(rèn)擬合一條直接荔燎。通過(guò)指定formula = y ~ poly(x,2)可以擬合二次多項(xiàng)式。通過(guò)加載splines包可以使用樣條模型:formula = y ~ ns(x,2)销钝。第二個(gè)參數(shù)是自由度:自由度越大有咨,曲線波動(dòng)越大。
p9 <- qplot(carat, price, data=dsmall, geom=c("point","smooth"), method="lm")
library(splines)
p10 <- qplot(carat, price, data=dsmall, geom=c("point","smooth"), method="lm", formula=y~ns(x,5))
grid.arrange(p9,p10, ncol=2)
- method="rlm"蒸健,與“l(fā)m”類似座享,但調(diào)用MASS包,擬合穩(wěn)健回歸直線纵装。
2.5.2 箱線圖和擾動(dòng)點(diǎn)圖
p11 <- qplot(color, price/carat, data=diamonds, geom="jitter") #擾動(dòng)點(diǎn)圖
p12 <- qplot(color, price/carat, data=diamonds, geom="boxplot") #箱線胡須圖
grid.arrange(p11,p12,ncol=2)
對(duì)于擾動(dòng)點(diǎn)圖征讲,可以如一般散點(diǎn)圖控制其他圖形屬性,如size, colour和shape橡娄。
對(duì)于箱線圖诗箍,可以用color控制框線顏色,fill設(shè)置填充顏色挽唉,size調(diào)節(jié)線的粗細(xì)滤祖。
2.5.3 直方圖和密度曲線圖
p13 <- qplot(carat, data=diamonds, geom="histogram") #直方圖
p14 <- qplot(carat, data=diamonds, geom="density") #密度曲線圖
grid.arrange(p13, p14, ncol=2)
對(duì)于密度曲線,adjust參數(shù)控制曲線的平滑程度瓶籽,取值越大匠童,曲線越平滑。
對(duì)于直方圖塑顺, binwidth參數(shù)汤求,通過(guò)設(shè)定組距來(lái)調(diào)節(jié)平滑度。 組距越小严拒,越體現(xiàn)細(xì)節(jié)扬绪。
對(duì)于分組分布比較,只需要再加上一個(gè)圖形映射裤唠。
p15 <- qplot(carat, data=diamonds, geom="density", color=color)
p16 <- qplot(carat, data=diamonds, geom="histogram", fill=color)
#等式后面的color是數(shù)據(jù)集中的變量color鉆石顏色挤牛,按color分組。
grid.arrange(p15,p16,ncol=2)
2.5.4 條形圖
在離散變量的情形下种蘸,條形圖與直方圖類似墓赴。
如果數(shù)據(jù)已經(jīng)匯總,或者想用其他的方式對(duì)數(shù)據(jù)進(jìn)行分組處理(如航瞭,對(duì)連續(xù)變量進(jìn)行分組求和)诫硕,可以使用weight幾何對(duì)象。
p17 <- qplot(color, data=diamonds, geom="bar") #普通條形圖
p18 <- qplot(color, data=diamonds, geom="bar", weight=carat) +
scale_y_continuous("carat") #按重量加權(quán)的條形圖刊侯,展示每種顏色的鉆石的總重量
grid.arrange(p17,p18,ncol=2)
2.5.5 時(shí)間序列中的線條圖和路徑圖
線條圖將點(diǎn)從左到右進(jìn)行連接(等價(jià)于將數(shù)據(jù)按X取值進(jìn)行排序章办,然后繪制路徑圖);x軸一般是時(shí)間,展示單變量隨時(shí)間變化的情況纲菌。
路徑圖按照點(diǎn)在數(shù)據(jù)集中的順序?qū)ζ溥M(jìn)行連接挠日。展示兩個(gè)變量隨時(shí)間聯(lián)動(dòng)的情況,時(shí)間反映在點(diǎn)的順序上翰舌。
p19 <- qplot(date, unemploy/pop, data=economics, geom="line") #失業(yè)率變化
p20 <- qplot(date, uempmed, data=economics, geom="line") #失業(yè)星期數(shù)的中位數(shù)變化
grid.arrange(p19,p20, ncol=2)
我們可以用一張散點(diǎn)圖表示失業(yè)率和失業(yè)時(shí)間長(zhǎng)度之間的關(guān)系嚣潜,但是我們不能看出變量關(guān)系隨時(shí)間的變化。解決辦法是將臨近時(shí)間點(diǎn)的散點(diǎn)連接起來(lái)椅贱,形成一張路徑圖懂算。
由于線條有很多交叉,我們可以將年份映射到color屬性上庇麦,方便看出時(shí)間的行進(jìn)方向计技。
year <- function(x) as.POSIXlt(x)$year +1900 #year函數(shù)提取年份
qplot(unemploy/pop, uempmed, data=economics, geom="path", color=year(date))
#可以看出雖然失業(yè)率失業(yè)時(shí)間長(zhǎng)度一直高度相關(guān),但最近幾年山橄,失業(yè)時(shí)間長(zhǎng)度與失業(yè)率相比有增長(zhǎng)的趨勢(shì)垮媒。
2.6 分面
分面將數(shù)據(jù)分割成若干子集,然后創(chuàng)建一個(gè)圖形矩陣航棱,將每一個(gè)子集繪制到圖形矩陣的窗格中睡雇。所有的子圖采用相同的圖形類型,并進(jìn)行一定的設(shè)計(jì)饮醇,使得它們之間方便比較它抱。
qplot()通過(guò)row_var ~ col_var表達(dá)式進(jìn)行指定∑蛹瑁可以指定任意數(shù)量的行變量和列變量观蓄,但注意當(dāng)變量數(shù)超過(guò)兩個(gè)時(shí),生成的圖形可能非常多祠墅,以至于不適合在屏幕上顯示侮穿。
如果只想指定一行或一列,可以使用.作為占位符饵隙,例如row_var ~ . 創(chuàng)建一個(gè)單列多行的圖形矩陣撮珠。
p21 <- qplot(carat, data=diamonds, facets = color ~ ., geom = "histogram", binwidth=0.1, xlim = c(0,3))
p22 <- qplot(carat, ..density.., data=diamonds, facets = color ~ ., geom = "histogram", binwidth=0.1, xlim = c(0,3))
# ..density..告訴ggplot2將密度而不是頻數(shù)映射到y(tǒng)軸沮脖。
grid.arrange(p21, p22, ncol=2)
#左圖展示的是頻數(shù)金矛,右圖展示的是頻率。在比較不同組分布時(shí)勺届,頻率圖不受該組樣本量大小的影響驶俊。圖形顯示,高質(zhì)量的鉆石(顏色D)在小尺寸分布上是偏斜的免姿,但隨著質(zhì)量下降饼酿,重量分布越來(lái)越平坦。
2.7 其他選項(xiàng)
其他一些控制圖形的外觀的參數(shù):
- xlim, ylim: 設(shè)置x軸和y軸的顯示區(qū)間。取值是一個(gè)長(zhǎng)度為2的向量故俐。例如xlime=c(0,20)想鹰;
- log: 一個(gè)字符型向量,說(shuō)明哪個(gè)坐標(biāo)軸應(yīng)該取對(duì)數(shù)药版。例如:log="x"辑舷,表示對(duì)x軸取對(duì)數(shù);log="xy"槽片,表示對(duì)x軸和y軸都取對(duì)數(shù)何缓。
- main:圖形的主標(biāo)題,可以是字符串还栓,也可以是一個(gè)表達(dá)式碌廓。例如main = expression(beta[1]==1)。更多數(shù)學(xué)表達(dá)式參見(jiàn)?plotmath命令剩盒。
- xlab, ylab:設(shè)置x軸和y軸的標(biāo)簽文字谷婆。可以是字符串辽聊,也可以是表達(dá)式波材。
p23 <- qplot(carat, price, data=dsmall,
xlab ="Weight(carats)" , ylab="Price($)",
main="Price-weight relationship"
)
p24 <- qplot(carat, price/carat, data=dsmall,
xlab = "Weight(carats)", ylab= expression(frac(price,carat)),
main="Price-weight relationship",
xlim=c(.2,1)
)
p25 <- qplot(carat, price, data=dsmall, log="xy")
grid.arrange(p23,p24,p25,ncol=3)