1.什么是qplot
qplot的意思是quick plot(快速作圖),利用qplot我們可以非常方便地繪制各種圖形。有時在其他作圖系統中需要好幾行代碼才能搞定的事情,在qplot()中只需要一行代碼就可以搞定。
通過?qplot()
命令查看qplot()的幫助文檔:
使用方法:
qplot(x, y = NULL, ..., data, facets = NULL, margins = FALSE,
geom = "auto", xlim = c(NA, NA), ylim = c(NA, NA), log = "",
main = NULL, xlab = deparse(substitute(x)),
ylab = deparse(substitute(y)), asp = NA, stat = NULL, position = NULL)
參數:
x, y :定義x軸和y軸
data:制定作圖的數據集
facets:分面
margins:
xlim,ylim:設置x軸和y軸的顯示區間,如xlim=c(0,20),ylim=c(-0.9,-0.5)
geom:定義幾何對象
log:指定哪一個坐標軸應該取對數,log="x"表明x軸取對數,log="xy"說明xy同時取對數
main:圖形的主標題,放置在圖形頂端中部,以大號字體顯示。如main="plot tittle"
xlab,ylab:設置x軸和y軸的標簽文字
2.數據集準備
使用ggplot2中自帶的一個叫做diamonds的數據集,里面包含了月5400顆鉆石的價格和質量信息。示例如下:
為了方便示例,隨機截取diamonds中的100個樣本:
set.seed(1410) #使每次產生的隨機數相同
dsmall <- diamonds[sample(nrow(diamonds), 100),]
3.一個簡單的例子:繪制一張散點圖
在Rstudio中輸入下面的代碼,畫一張以carat為x軸price為y軸的散點圖:
qplot(carat, price, data = diamonds)
qplot支持將變量的函數作為參數,下面畫一張log(carat)對log(price)的圖:
qplot(log(carat), log(price), data = diamonds)
畫一張重量對體積(近似以xyz表示)的圖:
qplot(carat, x*y*z, data = diamonds)
4.圖形屬性
在qplot中可以設置圖形屬性,以更形象地展示圖形中的信息,常用的圖形屬性包括形狀(shape)、顏色(colour)、大小(size)、透明度(alpha)等。
qplot(carat, price, data = dsmall) #不設置圖形屬性
qplot(carat, price, data = dsmall, colour = color) #設置color的顏色屬性
qplot(carat, price, data = dsmall, shape = cut) #設置cut的形狀屬性
qplot(carat, price, data = dsmall, colour = color,shape = cut) #設置color的顏色屬性,同時設置設置cut的形狀屬性
不設置圖形屬性:
設置color的顏色屬性:
設置cut的形狀屬性:
設置color的顏色屬性,同時設置設置cut的形狀屬性:
圖形屬性的手動設置
在上面的例子中,圖形屬性都是采用ggplot2的默認值,其實,我們可以通過I()
自己設定圖形屬性。
qplot(carat, price, data = dsmall, colour = I("red"))#手動設置圖形的顏色屬性
#手動設置圖形的透明度屬性,分母越小,透明度越大,通過設置透明度可以查看數據密集的區域
qplot(carat, price, data = diamonds, alpha = I(1/10))
qplot(carat, price, data = diamonds, alpha = I(1/100))
qplot(carat, price, data = diamonds, alpha = I(1/200))
設置alpha為1/10:
設置alpha為1/100:
設置alpha為1/200:
5.幾何對象
在ggplot2中,幾何對象描述了應該用何種對象對數據進行展示,其中一些幾何對象還關聯了相應的統計變換。通過改變幾何對象,我們幾乎可以畫出任何形式的圖。
下面展示一些常用的幾何對象:
展示二維的變量關系:
- geom = "point":用于繪制散點圖,當我們指定x軸和y軸后,ggplot2默認繪制散點圖
- geom = "smooth":你和一條平滑曲線,并將曲線和標準誤展示在圖中
- geom = "boxplot":繪制箱線圖,用于展示一系列點的分布情況
- geom = "jitter":繪制擾動圖,用于展示一系列點的分布情況
- geom = "path"和geom = "line":在數據的點之間繪制連線,線條圖(line)只能從創建從左到右的連線,而路徑圖(path)根據點在統計表格中的順序進行連線。
展示一維的變量關系:
對于一維分布,幾何對象的選擇是根據變量的類型而指定的。
- 對于連續變量:geom = "histogram"繪制直方圖,geom = "freqpoly"繪制頻率多邊形,geom = "density"繪制密度曲線。如果不指定幾何對象,ggplot默認繪制直方圖。
- 對于離散變量:geom = "bar"繪制條形圖。
向點圖中添加平滑曲線
用途:如果散點圖中有非常多的數據點,在展示數據時,數據的變化趨勢可能并不明顯,這時我們可以在圖中添加一條平滑曲線,用來更清楚地展示數據的變化趨勢。
#添加平滑曲線
qplot(carat, price, data = diamonds, geom = c("point","smooth"))
qplot(carat, price, data = dsmall, geom = c("point","smooth"))
qplot(carat, price, data = dsmall, geom = c("point","smooth"),se = FALSE) #不使用標準誤
作圖效果依次如下:
繪制diamonds的平滑曲線:
繪制dsmall的平滑曲線:
繪制dsmall的平滑曲線,并去掉標準差:
不同平滑器的選擇:
在擬合平滑曲線時,可以通過method來選擇不同的平滑器。
- 當數據量較小時(<1000),默認method = "loess",使用局部回歸的方法繪制平滑曲線。可通過span參數控制平滑度,取值范圍從0(很不平滑)到1(很平滑)。
- 當數據量大于1000時,默認使用method = "gam"擬合平滑線。
箱線圖和擾動圖
用途:如果一個數據集中包含了一個分類變量和一個或多個連續變量,可以通過箱線圖和擾動圖顯示連續變量是如何隨著分類變量水平的變化而變化的。
#使用箱線圖和擾動圖顯示鉆石的價格如何隨著顏色的變化而變化
qplot(color, price/carat, data = diamonds, geom = "boxplot") #箱線圖
qplot(color, price/carat, data = diamonds, geom = "jitter") #擾動圖
箱線圖:
擾動圖:
通過改變擾動圖的透明度,展示數據點集中的部分:
qplot(color, price/carat, data = diamonds, geom = "jitter", alpha = I(1/5)) #擾動圖,透明度為1/5
qplot(color, price/carat, data = diamonds, geom = "jitter", alpha = I(1/50)) #擾動圖,透明度為1/50
qplot(color, price/carat, data = diamonds, geom = "jitter", alpha = I(1/200)) #擾動圖,透明度為1/200
透明度為1/5:
透明度為1/50:
透明度為1/200:
箱線圖和擾動圖的比較
- 擾動圖可將所有的點繪制到圖中,重疊比較嚴重,可通過調節透明度部分解決重疊問題。可調控size、colour、shape等圖形屬性。
- 箱線圖使用數據的五個統計量(最小值,第一四分位數、中位數、第三四分位數和最大值)對對數據進行概括,可參考的統計值更多。可用colour控制外框線的顏色,用fill設置填充顏色,用size調節線的粗細。
直方圖和密度圖
用途:直方圖和密度曲線圖可以展示單個變量的分布,相對于箱線圖而言,它們提供了更多的關于單個分布的信息,但不容易在不同組之間進行比較。
qplot(carat, data = diamonds, geom = "histogram") #直方圖
qplot(carat, data = diamonds, geom = "density") #密度曲線圖
直方圖:
密度曲線圖:
平滑度的調整:
- 直方圖:通過binwidth調節組距,來調節平滑度。
- 密度曲線圖:使用adjust參數控制曲線的平滑度,adjust取值越大,曲線越平滑。
#直方圖,binwidth=1
qplot(carat, data = diamonds, geom = "histogram", binwidth = 1)
#直方圖,binwidth=0.1
qplot(carat, data = diamonds, geom = "histogram", binwidth = 0.1)
#直方圖,binwidth=0.01
qplot(carat, data = diamonds, geom = "histogram", binwidth = 0.01)
直方圖,binwidth=1
直方圖,binwidth=0.1
直方圖,binwidth=0.01
#密度曲線圖, adjust = 1
qplot(carat, data = diamonds, geom = "density", adjust = 1)
#密度曲線圖, adjust = 0.1
qplot(carat, data = diamonds, geom = "density", adjust = 0.1)
#密度曲線圖, adjust = 0.01
qplot(carat, data = diamonds, geom = "density", adjust = 0.01)
密度曲線圖, adjust = 1:
密度曲線圖, adjust = 0.1:
密度曲線圖, adjust = 0.01:
要在不同組之間進行分布對比,只需要再添加一個圖形映射即可:
#直方圖,binwidth=1,通過填充顏色比較鉆石顏色分組
qplot(carat, data = diamonds, geom = "histogram", binwidth = 1, fill = color)
#密度曲線圖, adjust = 1,通過線條顏色比較鉆石顏色分組
qplot(carat, data = diamonds, geom = "density", adjust = 1, colour = color)
直方圖,binwidth=1,通過填充顏色比較鉆石顏色分組:
密度曲線圖, adjust = 1,通過線條顏色比較鉆石顏色分組:
條形圖
用途:使用條形圖統計并展示每一個水平下的觀測數量。在離散型變量的情況下,條形圖和直方圖呈現的結果相似。
#繪制鉆石顏色的條形圖
qplot(color, data = diamonds, geom = "bar")
時間序列中的線條圖和路徑圖
用途:線條圖和路徑圖通常用于可視化時間序列數據。線條圖將點從左向右依次連接,而路徑圖按照點在數據集中出現的順序進行連接。
下面使用ggplot2中自帶的economics數據集進行演示,它包含了美國40年的經濟數據。
#繪制失業率(unemploy/pop)和時間變化關系的線條圖
qplot(date, unemploy/pop, data = economics, geom = "line")
#繪制失業率(unemploy/pop)和失業星期中位數(uempmed)變化關系的路徑圖
qplot(uempmed, unemploy/pop, data = economics, geom = "path")
#繪制失業率(unemploy/pop)和失業星期中位數(uempmed)變化關系的路徑圖,加上點
qplot(uempmed, unemploy/pop, data = economics, geom = c("point", "path"))
#繪制失業率(unemploy/pop)和失業星期中位數(uempmed)變化關系的路徑圖,加上點,年份映射上顏色
qplot(uempmed, unemploy/pop, data = economics, geom = c("point", "path"), colour = date)
繪制失業率(unemploy/pop)和失業星期中位數(uempmed)變化關系的路徑圖:
繪制失業率(unemploy/pop)和失業星期中位數(uempmed)變化關系的路徑圖,加上點:
繪制失業率(unemploy/pop)和失業星期中位數(uempmed)變化關系的路徑圖,加上點,年份映射上顏色:
分面
在前面的例子中,我們已經介紹過,可以使用圖形屬性(顏色和形狀)來比較不同的分組,可以將所有的組繪制在一張圖中。此外,分面也可以實現相同的功能,它將數據分隔成若干子集,然后創建一個圖形的矩陣,將每一個子集繪制到圖形矩陣的窗格中;所有子圖采用相同的圖形類型,并進行了一定的設計,使得他們之間可以進行方便的比較。
#以carat為x軸,并以color創建分面,將頻數映射的y軸
qplot(carat, data = diamonds, facets = color ~.,
geom = "histogram", binwidth = 0.1, xlim = c(0,3))
#以carat為x軸,并以color創建分面,將密度映射的y軸
qplot(carat, ..density.., data = diamonds, facets = color ~.,
geom = "histogram", binwidth = 0.1, xlim = c(0,3))
以carat為x軸,并以color創建分面,將頻數映射的y軸:
以carat為x軸,并以color創建分面,將密度映射的y軸: