2017年11月27日 星期一

R | ggplot: 其他圖型變化 - 密度和重疊圖

這篇要介紹其他的圖型變化,例如用點的大小、深淺(透明度),或是兩種圖重疊來表現。

首先,安裝下面這些要用到的 library。

library(ggplot2)
library(dplyr)
library(hexbin)
data(diamonds)
data(mpg)

用點的大小或深淺來表現是什麼意思呢?我們同樣用檔案資料 mpg 來舉例,假設我們要看 class 和 cty 的關係,先用 xtabs() 功能來看看。

xtabs() 是 cross tabulation,是用來看一個 variable 裡面的分佈,或是用來看兩個 variables 之間的關係。

如果想看某個 variable 裡面的分佈,語法是:xtabs(~ var1, data)

我們可以先來看看 class 裡面的分佈。

xtabs(~ class, mpg)

  class
2seater compact midsize minivan pickup subcompact  suv
      5      47      41      11     33         35   62

會顯示出 2seater 有五個,compact 有 47 個,minivan 有十一個等等。

如果想看兩個 variables 之間的關係的話,語法是這樣:xtabs(~ var1 + var2, data)

例如想看 cty 和 class 之間的關係,也就是 class 裡面各種車型裡 cty 的分佈情形。

xtabs(~ cty + class, mpg)



從上面的表格可以看到 2seater 的五個裡面,cty = 15 的有三個,cty = 16 的有兩個。

接下來,我們可以用點圖來表現。

ggplot(mpg, aes(class, cty)) + geom_point()



如果想把點變小,可以這樣:(不過在這個例子裡把點變小沒什麼特別的意義)

ggplot(mpg, aes(class, cty)) + geom_point(shape = '.')



可以把上面的表和圖做對照,例如在 2seater 裡面有兩種 cty, 15 的有三個,16 的有兩個。不過在上圖看不出來 15 的比 16 的多,這時我們可以讓點依數量而深淺(或透明度)不同,用的語法是在 geom_point() 裡面加入:alpah = 1/n(分母越大越透明)

ggplot(mpg, aes(class, cty)) + geom_point(alpha = 1/10)



除了用點的深淺或透明度呈現每個點的大小外,也可以用 geom_jitter()。當每個點有一個以上的量時,jitter 會用把它隨機分散。例如上面 2seater 裡的 15 有三個,在點圖上只呈現一個點,但在 jitter plot 上面會呈現出三個點。

ggplot(mpg, aes(class, cty)) + geom_jitter()

geom_jitter() 原本是下面這樣,後來簡化成上面那樣。

ggplot(mpg, aes(class, cty)) +
            geom_point(position = 'jitter')



可以看到 2seater 的 15 和 16 那附近有兩、三個點,但是因為預設值太分散了,所以分不清楚,這時我們可以設定其散落的範圍,例如把垂直移動(散落)的範圍設為 0,如此就能區分出 cty 的每個點,像是可以把 15 和 16 分開。

ggplot(mpg, aes(class, cty)) +
            geom_jitter(width = 0.2, height = 0)



也可以和 box plot 重疊。Box plot 的中間那一條是 medium (中間值,不是平均值),就是一個數列中,中間的那一個。上面那條線代表數列中的 25th percentiles (百分位),也就是中間值到最大值間的中間值,叫 Q3;下面那條線則是數列中的 75th percentiles,就是中間值到最小值間的中間值 ,叫 Q1。Q1 和 Q3 之間的距離,也就是 Q3-Q1,叫做 IQR (interquartile range)。(還是不懂的可以看這個影片

Box plot 的上下會有兩條鬚鬚,叫 whisker。它的長度在 R 裡的預設是 1.5,也就是:
max: Q3 + 1.5 * IQR
min: Q1 - 1.5 * IQR



我們先來看看 whisker 的預設是 1.5 是長怎樣(用預設的意思就是沒特別去設定),同時也把 outlier 設了顏色和形式,看看圖會變成怎樣。

ggplot(mpg, aes(class, cty)) +
            geom_boxplot(outlier.colour = "red",
                         outlier.shape = 1) +
            geom_jitter(width = 0.2, height = 0)



outlier.shape =  的語法裡: 0 = square, 1 = circle, 2 = triangle

設定 whisker 長度的語法是:coef = 

如果沒設的話就是 1.5 (如上圖)。如果設 coef = 0 的話,就是沒有那兩條鬚鬚。如果設為 coef = NULL,鬚鬚就會延伸到最大值和最小值。

ggplot(mpg, aes(class, cty)) +
            geom_boxplot(coef = NULL) +
            geom_jitter(width = 0.2, height = 0)



或是和 violin plot 重疊,之前因為覺得這種圖用不上,所以沒介紹,不過在這邊可以和 jitter plot 重疊看看。

ggplot(mpg, aes(class, cty)) +
            geom_violin() +
            geom_jitter(width = 0.2, height = 0)



再來,我們換特別的圖:geom_bin2b()

ggplot(mpg, aes(class, cty)) + geom_bin2d()



這個跟點圖的透明度類似,用顏色的深淺區分那個點的 count 有多少。

現在視覺話很夯,我們也可以用其他特別的圖來做視覺話,例如六角形的點。這個圖需要用到 library(hexbin)

在這個圖裡,我們把 class 裡面的 2seater 的資料拿掉,把拿掉後的資料設為 mpg_df。如果你還記得的話, !=  是指不等於,在這裡我們用 filter() 挑出 class 不是 2seater 的資料。

mpg_d1 <- filter(mpg, class != '2seater')

再用 mpg_df 來畫圖。

ggplot(mpg_d1, aes(class, cty)) + geom_hex()

也可以用 %>% 把上面兩個合在一起。(這邊看不懂的話,請看這篇。)

ggplot(mpg %>%
       filter(class != '2seater'), aes(class, cty)) +
       geom_hex()



最後,來做個練習。

Visualize the relationship between weight and price of the diamond in the “diamonds” dataset. Try the strategies we’ve just discussed to deal with overplotting.

ggplot(diamonds, aes(carat, price)) +
                 geom_point(alpha = 1/15)



也可以這樣畫。

ggplot(diamonds, aes(carat, price)) + geom_hex()












沒有留言:

張貼留言

歡迎發表意見