第一篇: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) |
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) |
(天阿,這篇花了我好多時間,但是不快點打完怕我會忘記。)
沒有留言:
張貼留言
歡迎發表意見