繪圖面(Facet)

善用 ggplot 的美學對應可以讓同一張圖形中的資料很方便的區分成不同的群組,而 ggplot 的繪圖面(facet)功能則提供另外一種資料區隔方式,它會先將資料分組後畫在表格式圖形中,而每一個子圖形的座標都相同,方便互相比較。

qplot 的繪圖面功能是使用 facets 參數配合公式的方式指定,公式的左邊是列(row)、右邊是行(column),例如:

qplot(carat, data = diamonds, facets = color ~ cut,
  geom = "histogram", binwidth = 0.1, xlim = c(0, 3))
r-package-ggplot2-tutorial-qplot-28

繪圖面

若只需要對一個變數分組,則將公式另一側指定為一個句點(.),例如:

qplot(carat, data = diamonds, facets = color ~ .,
  geom = "histogram", binwidth = 0.1, xlim = c(0, 3))
r-package-ggplot2-tutorial-qplot-29

繪圖面

其他用法

qplot 還有一些可以調整圖形的參數,這些用法與傳統的 plot 參數類似。

  • xlimylim:設定 x 軸與 y 軸的繪圖範圍。
  • log:指定需要對數轉換的座標軸,例如 log = "x" 就是將 x 軸經過對數轉換,而 log = "xy" 則是讓 x 與 y 軸都經過對數轉換。
  • main:指定圖形的標題,可指定為一般的字串或是以 expression 來表示的數學公式(詳細說明請參考 plotmath 的線上說明)。
  • xlabylab:指定 x 軸與 y 軸的名稱,其與 main 一樣可以指定為字串或數學公式。

以下是一個使用範例:

qplot(
  carat, price, data = diamonds.subset,
  xlab = "Price ($)", ylab = "Weight (carats)",
  main = "Price-weight relationship"
)

r-package-ggplot2-tutorial-qplot-31

qplot(
  carat, price/carat, data = diamonds.subset,
  ylab = expression(frac(price,carat)),
  xlab = "Weight (carats)",
  main="Small diamonds",
  xlim = c(.2,1)
)

r-package-ggplot2-tutorial-qplot-32

qplot(carat, price, data = diamonds.subset, log = "xy")

r-package-ggplot2-tutorial-qplot-33

qplotplot 的差異

以下是 qplot 的一些注意事項,以及與傳統 plot 之間的一些主要差異:

  • qplot 並不是泛用型的函數,不像 plot 可以接受各種的 R 物件,對不同類別的物件畫出不同的圖形。而 ggplot 這個函數則是一個泛用型的函數,它可以建立一個繪圖的基礎物件,並配合其他函數產生各種圖形。
  • 一般來說美學對應都會指定為一個有興趣的變數,讓 ggplot 自動依據該變數畫圖,如果只是單純要指定一個固定值,可以使用 I 函數,例如 color = I("red")
  • 傳統 plot 中的 colpchcex 等參數也可以用於 qplot 中,不過建議改用 ggplot 本身的參數名稱會比較好記,例如:colorshapesize
  • 在傳統的 R 繪圖系統上,若要在既有的圖形上增加元素,會使用 pointslinestext 這些函數,而在 ggplot 系統中則會以增加圖層(layers)的方式處理。

qplot 範例

# 產生繪圖用的因子變數
mtcars$gear <- factor(mtcars$gear,levels=c(3, 4, 5),
  labels=c("3gears", "4gears", "5gears"))
mtcars$am <- factor(mtcars$am,levels=c(0, 1),
  labels=c("Automatic", "Manual"))
mtcars$cyl <- factor(mtcars$cyl,levels=c(4, 6, 8),
  labels=c("4cyl", "6cyl", "8cyl"))

# 以 gear 分組畫出 mpg 密度函數圖
qplot(mpg, data = mtcars, geom = "density",
  fill = gear, alpha = I(.5),
  main="Distribution of Gas Milage",
  xlab="Miles Per Gallon",
  ylab="Density")

r-package-ggplot2-tutorial-qplot-34

# 將資料以 gear 與 cylinder 分組,
# 畫出 mpg 與 hp 的散佈圖,
# 並且以資料點的顏色與形狀標示 am
qplot(hp, mpg, data = mtcars, shape = am, color = am,
  facets = gear~cyl, size = I(3),
  xlab = "Horsepower", ylab = "Miles per Gallon")

r-package-ggplot2-tutorial-qplot-35

# 畫出箱形圖,
# 並且在上面用 jitter 資料點畫出實際資料的位置
qplot(gear, mpg, data = mtcars, geom = c("boxplot", "jitter"),
   fill = gear, main = "Mileage by Gear Number",
   xlab = "", ylab = "Miles per Gallon")

r-package-ggplot2-tutorial-qplot-36