《ggplot2: 數(shù)據(jù)分析與圖形藝術(shù)》學(xué)習(xí)筆記1


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、圖形語法

一張統(tǒng)計(jì)圖形是從數(shù)據(jù)幾何對象的圖形屬性的一個(gè)映射。此外,圖形中還可能包含數(shù)據(jù)的統(tǒng)計(jì)變換,最后繪制在某個(gè)特定的坐標(biāo)系中,而分面則可以用來生成數(shù)據(jù)不同子集的圖形。
一張統(tǒng)計(jì)圖形就是由上述這些獨(dú)立的圖形部件所組成的。

  • 最基礎(chǔ)的部分是你想要可視化的數(shù)據(jù)(data)以及一系列將數(shù)據(jù)中的變量對應(yīng)到圖形屬性的映射(mapping);
  • 幾何對象(geom):在圖中實(shí)際看到的圖形元素,如點(diǎn)、線、多邊形等;
  • 統(tǒng)計(jì)變換(stats):對數(shù)據(jù)進(jìn)行的某種匯總,如分組計(jì)數(shù)、線性回歸等??蛇x,但很有用。
  • 標(biāo)度(scale):將數(shù)據(jù)的取值映射到圖形空間,如用顏色、大小或形狀來表示不同的取值,使讀者可以從圖形中讀取原始數(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è)子集,以及如何對子集作圖并聯(lián)合進(jìn)行展示。分面也稱為條件作圖或網(wǎng)格作圖。

2、qplot(quick plot)快速作圖

主要學(xué)習(xí):

  • qplot()的基本用法
  • 數(shù)據(jù)和映射
  • 圖形屬性(如顏色、大小和形狀)
  • 幾何對象(如點(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)
    • 其他測量尺度(x, y, z)
library(gridExtra)  #支持ggplot2多圖并列
library(ggplot2)
data("diamonds")
head(diamonds)

這個(gè)數(shù)據(jù)集太大,我們?nèi)?00個(gè)隨機(jī)樣本來作圖展示。

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)
qplot-1.png

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)
mapping-1.png

不同類型的變量適合不同的圖形屬性:

  • 顏色和形狀適合于分類變量;
  • 大小適合于連續(xù)變量;
  • 數(shù)據(jù)量很大,不同組的數(shù)據(jù)之間很難區(qū)分,適合于分面。

2.5 幾何對象

適用于考察二維變量關(guān)系的幾何對象:

  • geom="point",繪制散點(diǎn)圖。
  • geom="smooth",擬合一條平滑曲線,并將曲線和標(biāo)準(zhǔn)誤展示在圖中。
  • geom="boxplot",繪制箱形胡須圖,用以概括一系列點(diǎn)的分布情況。
  • geom="path"和geom="line"可以在數(shù)據(jù)點(diǎn)之間繪制連線。
    • 路徑圖可以是任意的方向;
    • 線條圖只能創(chuàng)建從左到右的連線。

適用于考察一維變量分布的幾何對象:

對于連續(xù)變量:

  • geom="histogram", 繪制直方圖;
  • geom="freqpoly",繪制頻率多邊形;
  • geom="density",繪制密度曲線。
  • qplot()默認(rèn)直方圖。

對于離散變量:

  • geom="bar",繪制條形圖。

2.5.1 平滑曲線

添加平滑曲線,展示數(shù)據(jù)趨勢。

p5 <- qplot(carat, price, data=dsmall, geom=c("point","smooth")) 
#利用c()函數(shù)將多個(gè)幾何對象組成一個(gè)向量傳遞給geom。幾何對象會(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)
smooth-1.png

利用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)
loess-1.png
  • method="gam", formula=y ~ s(x),調(diào)用mgcv包擬合一個(gè)廣義可加模型。這個(gè)模型與lm中的樣條模型類似,但樣條的階數(shù)是通過數(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)
mgcv-1.png
  • method="lm",默認(rèn)擬合一條直接。通過指定formula = y ~ poly(x,2)可以擬合二次多項(xiàng)式。通過加載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)
splines-1.png
  • 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)
jitter-1.png

對于擾動(dòng)點(diǎn)圖,可以如一般散點(diǎn)圖控制其他圖形屬性,如size, colour和shape。
對于箱線圖,可以用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)
histogram-1.png

對于密度曲線,adjust參數(shù)控制曲線的平滑程度,取值越大,曲線越平滑。
對于直方圖, binwidth參數(shù),通過設(shè)定組距來調(diào)節(jié)平滑度。 組距越小,越體現(xiàn)細(xì)節(jié)。

對于分組分布比較,只需要再加上一個(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)
group-1.png

2.5.4 條形圖

在離散變量的情形下,條形圖與直方圖類似。
如果數(shù)據(jù)已經(jīng)匯總,或者想用其他的方式對數(shù)據(jù)進(jìn)行分組處理(如,對連續(xù)變量進(jìn)行分組求和),可以使用weight幾何對象。

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)
bar-1.png

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)
serial-1.png

我們可以用一張散點(diǎn)圖表示失業(yè)率和失業(yè)時(shí)間長度之間的關(guān)系,但是我們不能看出變量關(guān)系隨時(shí)間的變化。解決辦法是將臨近時(shí)間點(diǎn)的散點(diǎn)連接起來,形成一張路徑圖。
由于線條有很多交叉,我們可以將年份映射到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í)間長度一直高度相關(guān),但最近幾年,失業(yè)時(shí)間長度與失業(yè)率相比有增長的趨勢。
path-1.png

2.6 分面

分面將數(shù)據(jù)分割成若干子集,然后創(chuàng)建一個(gè)圖形矩陣,將每一個(gè)子集繪制到圖形矩陣的窗格中。所有的子圖采用相同的圖形類型,并進(jìn)行一定的設(shè)計(jì),使得它們之間方便比較。

qplot()通過row_var ~ col_var表達(dá)式進(jìn)行指定??梢灾付ㄈ我鈹?shù)量的行變量和列變量,但注意當(dāng)變量數(shù)超過兩個(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ì)量下降,重量分布越來越平坦。
facet-1.png

2.7 其他選項(xiàng)

其他一些控制圖形的外觀的參數(shù):

  • xlim, ylim: 設(shè)置x軸和y軸的顯示區(qū)間。取值是一個(gè)長度為2的向量。例如xlime=c(0,20);
  • log: 一個(gè)字符型向量,說明哪個(gè)坐標(biāo)軸應(yīng)該取對數(shù)。例如:log="x",表示對x軸取對數(shù);log="xy",表示對x軸和y軸都取對數(shù)。
  • main:圖形的主標(biāo)題,可以是字符串,也可以是一個(gè)表達(dá)式。例如main = expression(beta[1]==1)。更多數(shù)學(xué)表達(dá)式參見?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)
others-1.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容