2017年11月19日 星期日

R | ggplot: Faceting

這篇要介紹的是 faceting,就是把檔案資料畫成一組圖,而不是只有一張圖。要看懂這篇需要先看前面三篇哦。

第一篇:Ggplot2 | Point plot & Box plot

第三篇:Ggplot2 | Regression Line & Grouping

上課講義請參考:R Graphics with Ggplot2 - Day 2

這邊同樣要用到下面這些:

library(ggplot2)

分圖要用的指令是:facet_grid(row ~ col)

或是:facet_wrap( ~ variable)

裡面放的是要依照哪個 variable 來分隔圖,前面是指用 row (列)來分圖,後面是指用 column (行)來分圖,可以只放其中一個。

我們先看下面的例子,一樣是用檔案資料 mpg。

ggplot(mpg, aes(displ, hwy, shape = drv)) +
            geom_point(aes(colour = factor(cyl)))



我們可以用 cyl = 5 的那個點來做 marker,5 只有兩個,是綠色三角形(drv, f),所以當你用 drv 來分圖的時候,只有 f 那個圖會有綠色的那兩點。

現在來用用看 facet_grid(),我們用 drv 並以 column 來分圖,所以會是這樣:

ggplot(mpg, aes(displ, hwy)) +
            geom_point(aes(colour = factor(cyl))) +
            facet_grid(. ~ drv)

前面沒放 variable 的話,就用點點 "." 。

也可以把 colour = factor(cyl) 這個放在前面的 ggplot() 裡面,變成這樣:

ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
            geom_point() +
            facet_grid(. ~ drv)



注意到了嗎?綠色那兩點指出現在中間 f 那個圖裡。

如果是依 row 來分圖,就是這樣:

ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
            geom_point() +
            facet_grid(drv ~ .)



接下來,我們可以依兩種 variables 分圖,行用 year,列用 drv。同樣用 cyl = 5 那兩點的做 marker,那兩點的年是 2008,所以它會出現在 f 和 2008 那一格圖中。

ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
            geom_point() +
            facet_grid(year ~ drv)



上面用的 variable 中的元素都不會太多,頂多分個三、四個圖,但如果像是 manufacturer,就會變得很擠,像下圖那樣。

ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
            geom_point() +
            facet_grid(manufacturer ~ .)



這時候可以用 facet_wrap(),會把圖由左往右,由上往下排出來。

ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
            geom_point() +
            facet_wrap(~ manufacturer)



你也可以指定要有幾個 columns,可以用  ncol =

ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
            geom_point() +
            facet_wrap(~ manufacturer, ncol = 5)



接下來,來點複雜的。我們可以不用整個 dataset,如果只想要其中幾種資料,或是要過濾掉幾個元素的話,可以用 filter() 的功能挑出你要用的。

先設一個 dataframe, d0。用 filter() 功能從 mpg 裡面挑出 cyl 不是 5,且 drv 裡面符合 "4" 和 "f" 的。

var %in% c(" ", " ") 是用來從你想要的 variables 那個 column 裡面找出符合條件的。%in% 意指 match。如果還記得的話, !=  是指不等於,可以參考基本指令這篇

d0 <- filter(mpg, cyl != 5, drv %in% c("4", "f"))



可以看見,d0 裡面的 cyl 沒有 5,drv 裡面也只有 f 和 4。

接下來,用這個畫圖。先設第一層 p0。(關於 %>% 的解釋和用法請看這篇。)

p0 <- d0 %>%
         ggplot(aes(cty, hwy))

再用 p0 設第二層,用法和解釋請看上篇

p4 <- p0 + geom_point()



上圖是用 d0 的資料畫出來的點圖 p4。

也可以依 variable 用顏色區分。

p5 <- p0 + geom_point(aes(colour = drv))



接下來,我們把圖 p5 用分成小圖。如果列的部分是用 drv 分圖,因為 drv 我們擷取出 4 和 f 的部分,所以只會有兩列,一列是 4,一列是 f。因為是也用 drv,所以可以明顯看出兩個顏色各一邊。

p5 + facet_grid(. ~ drv)



如果是用另一個 variable,例如分用 cyl 分圖,就會每個小圖都有兩種顏色。因為我們過濾掉 5,只剩下 4, 6, 8,所以只會有三列(columns)。

p5 + facet_grid(. ~ cyl)



因為已經把 p5 設好了,所以只在在後面直接加 facet_grid() 就好了。

p5 + facet_grid(drv ~ cyl)



也可以直接加在 p0 後面,像這樣:

p0 + geom_point(aes(colour = drv)) +
     facet_grid(drv ~ cyl)



如果是用 facet_grid() 裡面的另一個 variable,也就是 cyl,因為它不是 factor 或 character,出來的就會是色階,但也可以看到顏色上的區分。

p0 + geom_point(aes(colour = cyl)) +
     facet_grid(drv ~ cyl)



如果不是用已經用在 facet_grid() 裡面的 variable,而是用另外的 variable(例如 class),就會變成這樣:

p0 + geom_point(aes(colour = class)) +
     facet_grid(drv ~ cyl)



也可以同時用 drv 和 cyl 分列,變成這樣:(這裡有在點的部份指定顏色)

p0 + geom_point(color = 'navy') +
     facet_grid( ~ drv + cyl)



這樣很擠,可以用 facet_wrap()。

p0 + geom_point(aes(colour = cyl)) +
     facet_wrap( ~ drv + cyl)



如果把 cyl 設為 factor,就會變成這樣:

p0 + geom_point(aes(colour = factor(cyl))) +
     facet_wrap( ~ drv + cyl)



如果你有注意到的話,會發現分成小圖後,每個小圖的 scale 都是一樣的,這是預設好的,如果要讓每個圖有自己的 scale,可以在 facet 裡面加:scale = " "

讓 X-axis 有自己的 scale,用的是:scales = "free_x"

p5 + facet_grid(~cyl, scales = "free_x")



注意上圖中,每個小圖的 X-axis 刻度都不一樣,但是 Y-axis 的刻度是一致的。下圖則是設成讓 Y-axis 有自己的刻度。

p5 + facet_grid(~ cyl, scales = "free_y")



如果要讓兩個軸都有自己的 scale,就用:scales = "free"

p5 + facet_wrap(~ cyl, scales = "free")





最後,來練習一下吧。

Exercise. Use a histogram to explore the distribution of engine size for different vehicle classes.

ggplot(mpg, aes(displ)) +
            geom_histogram() +
            facet_wrap(~ class)





(天阿,這篇花了我好多時間,但是不快點打完怕我會忘記。)










沒有留言:

張貼留言

歡迎發表意見