文章出處

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分類,不同顏色的鉆石由不同顏色的點代表)

image

#1.2. 簡單的散點圖(利用shape分類,不同的切割方式由不同形狀的點代表)

image

#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"))

        image

#參數調整:method=""等
     #(a). method = "loess", 默認平滑算法, 通過span=調整窗寬, span=0(波動) 到 span=1(光滑)

qplot(carat, price, data = dsmall, geom = c("point", "smooth"),
      method = "loess",span=0.2)

        image

# (b). method = "gam": GAM 在大數據時比loess高效,需要載入 mgcv 包

library(mgcv)
qplot(carat, price, data = dsmall, geom = c("point", "smooth"),
      method="gam", formula = y ~ s(x))

image

# (c). method="lm", 線性平滑

qplot(carat, price, data = dsmall, geom = c("point", "smooth"),
     method = "lm")

image

# 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))

image

# method = "rlm", robust linear model, 受異常值影響小,需要載入MASS包

library(MASS)
qplot(carat, price, data = dsmall, geom = c("point", "smooth"),
      method = "rlm")

image

# 2.2:x為屬性變量,y為連續變量,繪制boxplot

qplot(color, price/carat, data=diamonds,geom="boxplot")

image

# 2.3:單變量,直方圖

qplot(carat, data = diamonds, geom = "histogram")

image

#2.4: 單變量,核密度估計圖

qplot(carat, data = diamonds, geom = "density")

image

# 按不同顏色繪制的density圖

qplot(carat, data = diamonds, geom = "density",colour=color)

image

# 2.5 條形圖(柱狀圖)

#計數,求count(color)
qplot(color, data = diamonds, geom = "bar")

image

#加權,對每個求sum(carat),類似于excel里的數據透視圖,按不同的color計算carat的總和
qplot(color, data = diamonds, geom = "bar", weight = carat)

image

#2.6. Time-series
qplot(date, unemploy / pop, data = economics, geom = "line")

image

#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))

image

我們已經討論了如何利用外觀參數在同一圖中比較不同分類的差異。而分面可以將不同的亞類放在不同的圖中進行比較:

qplot(carat, data = diamonds, facets = color ~ .,geom = "histogram", binwidth = 0.1, xlim = c(0, 3))

image

qplot(carat, data = diamonds, facets = color ~ .,geom = "histogram", binwidth = 0.1, xlim = c(0, 3))

image

下面的圖形在一開始的基礎上添加了新的元素:分面,多個圖層以及統計數據。分面和圖層擴展了上面提到的數據結構:每一個分面的每一個圖層都有屬于自己的數據集。你可以將它想象成是一個三維的數組:分面構成了二維平面,然后圖層給予其在新的維度上的擴展。在這個例子中,不同圖層上的數據是一樣的,但是從理論上來講,不同的圖層中可以有不同的數據。

qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()

image

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()  #散點圖

image

ggplot(mpg, aes(x = displ)) + geom_histogram(aes(y = (..count..)), fill = "steelblue", colour = "#808080", bin = 0.1)  #直方圖

image

ggplot(mpg, aes(y = displ, x = factor(cyl), fill = factor(cyl))) + geom_boxplot()  #盒圖

image

ggplot(diamonds, aes(carat, price)) + stat_bin2d()  #二維密度圖

image

p + geom_point() + stat_smooth(method = "lm", se = F)

image

ggplot(mpg, aes(x = cty, y = hwy)) + geom_point(aes(colour = factor(year))) + stat_smooth(method = "lm", se = F)  #請注意兩種方式的區別

image

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"))

image

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)

image

ggplot2中的基本概念

將數據中變量映射到圖形屬性。映射控制了二者之間的關系。

image

標度:標度負責控制映射后圖形屬性的顯示方式。具體形式上來看是圖例和坐標刻度。scale和mapping是緊密相關的概念。

image

幾何對象(Geometric):幾何對象代表我們圖中看到的圖形元素,如點、線、多邊形等。

image

統計變換(Statistics):對原始數據進行某種計算,例如二元散點上加上一條回歸線。

image

坐標系統(Coordinate):坐標系統控制坐標軸并影響所有圖形元素,坐標軸可以進行變換以滿足不同的需要。

image

圖層(Layer):數據、映射、幾何對象、統計變換等構成一個圖層。圖層可以允許用戶一步步的構建圖形,方便單獨對圖層進行修改。

image

分面(Facet):條件繪圖,將數據按某種方式分組,然后分別繪圖。分面就是控制分組繪圖的方法和排列形式。

image

總結

關于ggplot2的繪圖功能還有待進一步挖掘。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()