跟我一起ggplot2(1)
ggplot2
R的作圖工具包,可以使用非常簡單的語句實現非常複雜漂亮的效果。
qplot
載入qplot
library(ggplot2)
# 測試資料集,ggplot2內建的鑽石資料
qplot(carat, price, data = diamonds)
dsmall <- diamonds[sample(nrow(diamonds), 100), ] #對diamonds資料集進行抽樣
#1. 按color,size,shape的基本分類視覺化 #1.1 簡單的散點圖(利用color分類,不同顏色的鑽石由不同顏色的點代表)
#1.2. 簡單的散點圖(利用shape分類,不同的切割方式由不同形狀的點代表)
#2. 繪製不同型別的圖表:geom引數
qplot(x,y,data=data,geom="")中的geom=""用來控制輸出的圖形型別 I. 兩變數圖 (1) geom="points",預設引數,繪製散點圖(x,y) (2) geom="smooth" 繪製平滑曲線(基於loess, gam, lm ,rlm,glm) (3) geom="boxplot" 繪製箱線圖 ,當x為屬性變數(factor),y為數值變數時 II.單變數圖 (4) geom="histogram",直方圖 (5) geom="density",核密度估計圖 (6) geom="bar",條形圖barchart III.時間序列 (7) geom="line",折線圖,可用於時間序列(當x=date) (8) geom="path",路徑圖(參見後文)
# 2.1 同時繪製散點圖+平滑直線
qplot(carat, price, data = dsmall, geom=c("point","smooth"))
#引數調整:method=""等 #(a). method = "loess", 預設平滑演算法, 通過span=調整窗寬, span=0(波動) 到 span=1(光滑)
qplot(carat, price, data = dsmall, geom = c("point", "smooth"),
method = "loess",span=0.2)
# (b). method = "gam": GAM 在大資料時比loess高效,需要載入 mgcv 包
library(mgcv)
qplot(carat, price, data = dsmall, geom = c("point", "smooth"),
method="gam", formula = y ~ s(x))
# (c). method="lm", 線性平滑
qplot(carat, price, data = dsmall, geom = c("point", "smooth"),
method = "lm")
# method="lm",formula = y ~ ns(x, 3),三次自然樣條,需要載入splines包
library(splines)
qplot(carat, price, data = dsmall, geom = c("point", "smooth"),
method = "lm", formula = y ~ ns(x, 3))
# method = "rlm", robust linear model, 受異常值影響小,需要載入MASS包
library(MASS)
qplot(carat, price, data = dsmall, geom = c("point", "smooth"),
method = "rlm")
# 2.2:x為屬性變數,y為連續變數,繪製boxplot
qplot(color, price/carat, data=diamonds,geom="boxplot")
# 2.3:單變數,直方圖
qplot(carat, data = diamonds, geom = "histogram")
#2.4: 單變數,核密度估計圖
qplot(carat, data = diamonds, geom = "density")
# 按不同顏色繪製的density圖
qplot(carat, data = diamonds, geom = "density",colour=color)
# 2.5 條形圖(柱狀圖)
#計數,求count(color)
qplot(color, data = diamonds, geom = "bar")
#加權,對每個求sum(carat),類似於excel裡的資料透檢視,按不同的color計算carat的總和
qplot(color, data = diamonds, geom = "bar", weight = carat)
#2.6. Time-series
qplot(date, unemploy / pop, data = economics, geom = "line")
#2.7. Path plot #如果要檢視失業率(unemploy / pop)與平均失業時間(uempmed)之間的關係,一個方法是利用散點圖,但是這樣做就會導致無法觀察到隨時間變化的趨勢了,path plot利用顏色深淺來代表年份,隨著顏色從淺藍變成深藍,可以觀察到失業率與失業時間的關係的變化趨勢。
#具體實現:先自定義函式year(),將字串格式的時間轉化為年
year <- function(x) as.POSIXlt(x)$year + 1900
#畫出path plot,顏色按年份由淺到深
qplot(unemploy / pop, uempmed, data = economics,
geom = "path", colour = year(date))
我們已經討論瞭如何利用外觀引數在同一圖中比較不同分類的差異。而分面可以將不同的亞類放在不同的圖中進行比較:
qplot(carat, data = diamonds, facets = color ~ .,geom = "histogram", binwidth = 0.1, xlim = c(0, 3))
qplot(carat, data = diamonds, facets = color ~ .,geom = "histogram", binwidth = 0.1, xlim = c(0, 3))
下面的圖形在一開始的基礎上添加了新的元素:分面,多個圖層以及統計資料。分面和圖層擴充套件了上面提到的資料結構:每一個分面的每一個圖層都有屬於自己的資料集。你可以將它想象成是一個三維的陣列:分面構成了二維平面,然後圖層給予其在新的維度上的擴充套件。在這個例子中,不同圖層上的資料是一樣的,但是從理論上來講,不同的圖層中可以有不同的資料。
qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()
ggplot
基本繪圖型別:
這些幾何元素是ggplot的基礎。他們彼此結合可以構成複雜的影象。他們中的絕大多數對應特定的繪圖型別。
geom_area()
geom_bar()
geom_line()
geom_point()
geom_polygon()
geom_text()
geom_tile()
> library("ggplot2")
> head(mpg)
manufacturer model displ year cyl trans drv cty
1 audi a4 1.8 1999 4 auto(l5) f 18
2 audi a4 1.8 1999 4 manual(m5) f 21
3 audi a4 2.0 2008 4 manual(m6) f 20
4 audi a4 2.0 2008 4 auto(av) f 21
5 audi a4 2.8 1999 6 auto(l5) f 16
6 audi a4 2.8 1999 6 manual(m5) f 18
hwy fl class
1 29 p compact
2 29 p compact
3 31 p compact
4 30 p compact
5 26 p compact
6 26 p compact
> p <- ggplot(mpg, aes(x = cty, y = hwy, colour = factor(year)))
> summary(p)
data: manufacturer, model, displ, year, cyl,
trans, drv, cty, hwy, fl, class [234x11]
mapping: x = cty, y = hwy, colour = factor(year)
faceting: facet_null()
然後就是幾何物件和統計,簡單的理解就是通過統計變換把前面的元素表現出來,因為統計變換的函式stat開頭的預設有包含自己的幾何圖形,而幾何圖形函式geom又帶有自己的統計變換,通常都能達到目的。
p + geom_point() #散點圖
ggplot(mpg, aes(x = displ)) + geom_histogram(aes(y = (..count..)), fill = "steelblue", colour = "#808080", bin = 0.1) #直方圖
ggplot(mpg, aes(y = displ, x = factor(cyl), fill = factor(cyl))) + geom_boxplot() #盒圖
ggplot(diamonds, aes(carat, price)) + stat_bin2d() #二維密度圖
p + geom_point() + stat_smooth(method = "lm", se = F)
ggplot(mpg, aes(x = cty, y = hwy)) + geom_point(aes(colour = factor(year))) + stat_smooth(method = "lm", se = F) #請注意兩種方式的區別
ggplot(mpg, aes(y = hwy, x = class, colour = class)) + geom_boxplot() + geom_jitter(alpha = 0.3) +
theme(panel.grid = element_blank(), panel.background = element_rect(fill = NA, colour = "black"))
ggplot(mpg, aes(x = displ)) + stat_bin(aes(y = ..density.., fill = factor(year)),
colour = "#909090") + stat_density(aes(ymax = "density", colour = factor(year)),
geom = "line", size = 1.2) + facet_wrap(~year, ncol = 1)
ggplot2中的基本概念
將資料中變數對映到圖形屬性。對映控制了二者之間的關係。
標度:標度負責控制對映後圖形屬性的顯示方式。具體形式上來看是圖例和座標刻度。scale和mapping是緊密相關的概念。
幾何物件(Geometric):幾何物件代表我們圖中看到的圖形元素,如點、線、多邊形等。
統計變換(Statistics):對原始資料進行某種計算,例如二元散點上加上一條迴歸線。
座標系統(Coordinate):座標系統控制座標軸並影響所有圖形元素,座標軸可以進行變換以滿足不同的需要。
圖層(Layer):資料、對映、幾何物件、統計變換等構成一個圖層。圖層可以允許使用者一步步的構建圖形,方便單獨對圖層進行修改。
分面(Facet):條件繪圖,將資料按某種方式分組,然後分別繪圖。分面就是控制分組繪圖的方法和排列形式。
總結
關於ggplot2的繪圖功能還有待進一步挖掘。