1. 程式人生 > 其它 >跟我一起ggplot2(1)

跟我一起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的繪圖功能還有待進一步挖掘。