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












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)





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










飲酒和人際關係之間的關聯

前兩天看到這個研究覺得好好笑。因為酒精成癮(alcohol addiction)的臨床研究無法讓實驗參與者喝酒,會有倫理上的問題,所以用草原田鼠 prairie vole 當做研究 model。會選牠做為飲酒是否會影響人際關係研究的 model animals 是因為草原田鼠是單一伴侶制(monogamous),而且愛酒精勝過水。其他的老鼠不適合作為研究是因為牠們不像草原田鼠會和單一對象產生特別的連結(pair bonding),而是貨真價值的社交動物,如果單獨待在一個籠子裡會焦慮緊張,而且也沒那麼愛喝酒。


Picture / Todd Ahern, Smithsonian Magazine 2014

之前有研究是關於飲酒和家人之間關係的,他們把田鼠兄弟或田鼠姐妹同籠相處五天(純喝水),之後讓牠們繼續住一起,或是分籠住。因為草原田鼠和自己的兄弟姊妹產生強大的連結後,分開會變得焦慮,所以研究者認為被分開的田鼠會因此喝比較多的酒。讓田鼠和兄弟姊妹分開開後,在籠子裡放一瓶酒和一瓶糖水,結果住一起的田鼠喝的酒比自己住的喝得還多,表示社交活動在田鼠身上反而會助酒興。 XD(其他品種的老鼠是當處於因獨居而焦慮的情況下時,反而會喝比較多酒。)

另有研究是關於飲酒和同儕之間的關係,他們先給田鼠兩種飲料選擇,一個是水,一個是高濃度的酒。喝了四天後,記錄牠們這四天的喝酒量,然後讓喝很多酒的(high drinker)和喝很少酒的(low drinker)(同性別)住在一起四天,同樣也提供酒和水兩種選擇。結果喝很多酒的田鼠在跟喝的少一起住了以後,喝的酒量減少了,而且當之後自己住的時候,酒量也維持少量,並沒有變回喝得比較多。喝得少的田鼠和喝得多的一起住了以後,有的喝得比較多,有的沒有。如果喝得多的和喝得多的住在一起,或喝得少的和喝得少得住在一起,那兩者喝的酒量就沒變。如果還是自己住的,那就還是喝的跟原本一樣多。這些結果顯示草原田鼠的飲酒量是會因為同儕而改變的。

在之前關於飲酒是否影響夫妻關係的研究裡,他們給喝很多酒的公鼠(跟沒喝酒的比)兩個選擇 -- 元配和小三,結果公鼠選擇了小三。但是母鼠相反,喝很多酒的母鼠會選擇元配勝過小王。在這個新的實驗裡,他們把每對田鼠(已認定彼此)分成兩組,一組是只有水喝,一組是有酒也有水。最後控制組是只有公鼠有酒和水兩種選擇。讓每對田鼠親密相處了一個禮拜後,將牠們用鐵網隔開,讓牠們只能相望相聞相對話,但卻不能相擁。分隔之後,再讓公鼠選擇要元配還是要小三,結果在元配和公鼠喝了差不多量的酒的情況下,公鼠選擇惹元配!但如果只有公鼠有喝酒,元配沒有,那公鼠就會選擇小三。

所以這是一個要喝就一起喝,不能只有老公喝的概念嗎?(而且還不能喝得比老公少)XD



Article:

New Scientist / Prairie vole partners split up if one drinks more than the other (2017)


Papers:

AM Anacker et al, Prairie voles as a novel model of socially facilitated excessive drinking. Addiction Biology (2011)

AM Anacker et al, Alcohol Intake in Prairie Voles is Influenced by the Drinking Level of a Peer. Alcohol Clin Exp Res. (2011)









2017年11月18日 星期六

R | ggplot: Regression Line & Grouping

這篇要講的是在圖上加趨勢線(regression line)和 grouping。需要用到下面的東西,先安裝吧。

library(ggplot2)
library(nlme)
library(dplyr)
library(gapminder)

重新開 R Studio 的話,要重跑一次 ggplot2,不然會顯示沒有這個 function。

課堂講義請參考這篇:R Graphics with Ggplot2 - Day2

加趨勢線用的是: geom_smooth()

geom_smooth() 預設的方法(method)是 loess,也就是 Local Polynomial Regression Fitting。

下面先比較檔案資料 mpg 裡面的參數 hwy 和 displ 的關係。

#1
ggplot(mpg, aes(displ, hwy)) +
            geom_point() + geom_smooth()



灰色的部分是 confidence intervals (CI),如果不想要的話,就加 se = FALSE

ggplot(mpg, aes(displ, hwy)) +
            geom_point() +
            geom_smooth(se = FALSE)

如果你想要的是 liner regression (lm),可以加: method = "lm" 

加了 method 的話就會覆蓋住(override)原本預設的 loess,如果沒加的話,呈現的就是預設的 loess。

#2
ggplot(mpg, aes(displ, hwy)) + geom_point() +
                               geom_smooth(method = "lm")



另外還有 robust linear regression (rlm),但這個需要裝 library(MASS)

ggplot(mpg, aes(displ, hwy)) + geom_point() +
                               geom_smooth(method = "rlm")



在這裡解釋一下,這些圖的語法可以把它分成兩層來想,第一層是 ggplot(),第二層是 geom_point() 和 geom_smooth()。第二層的 geom_smooth 跟 geom_point 同樣是獨立的,可以分開用,也可以合在一起用,所以兩個的 y-axis 用的 variables 可以不一樣。在第二層裡設的東西會覆蓋住第一層的。

在上面的例子裡,第二層的 variables 都沒有另外指定,所以都是第一層裡設的 y-axis,也就是 hwy,圖裡呈現的趨勢線也是依照 hwy 的數據畫出來的。但是,趨勢線也可以設定為另外的 variable。

在下面的例子裡,我們把第二層用不同的 variables 設定,點的部分用 cyl 分組以不同顏色顯示(在這邊把 cyl 設成 factor,不懂的話請看上篇),然後趨勢線設成 cty 的。

#3
ggplot(mpg, aes(displ, hwy)) +
            geom_point(aes(colour = factor(cyl))) +
            geom_smooth(aes(y = cty))



上圖顯示的點是依照 cyl 分不同顏色,但趨勢線是依照 cty 畫的。(可以和圖 #1 做比較)

如果把 factor 設在第一層 ggplot(),那點圖和趨勢線沒特別設定的話,會依第一層的分組,例如下面的點和趨勢線都是照 cyl 分成四種,但趨勢線的 y 設定為 cty 覆蓋了第一層的 hwy,所以是 cty 的現,而不是 hwy 的線。

#4
ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
            geom_point() +
            geom_smooth(aes(y = cty))



想要更清楚分層的話,可以把第一層 ggplot() 設為一個 object,其他的再加在後面。

例如,可以把:

ggplot(mpg, aes(displ, hwy)) +
            geom_point(aes(colour = factor(cyl))) +
            geom_smooth(method = "lm")

變成這樣:

#5
p1 <- ggplot(mpg, aes(displ, hwy))
p1 + geom_point(aes(colour = factor(cyl))) +
     geom_smooth(method = "lm")



在這個例子裡,p1 只有最基本 x 和 y 軸有設定,其他的部分再另外加,例如在點的部分用 factor 的參數以不同顏色分組,上圖的參數是 cyl。因為加的部分是獨立的,所以在點設的不會影響到趨勢線的,趨勢線的部分因為沒設,所以還是依照第一層(p1)的,也就是 hwy。如果在 geom_smooth 那邊用 factor 設定顏色的話,趨勢線就會依 factor 分組,線也會跟著 factor 換顏色。

#6
p1 + geom_point(aes(colour = factor(cyl))) +
     geom_smooth(aes(colour = factor(cyl)), method = "lm")



我們把點的設定拿掉,看看會變成怎樣。

#7
p1 + geom_point() +
     geom_smooth(aes(colour = factor(cyl)), method = "lm")



和圖六比較,有發現什麼不同嗎?圖六因為點也是依照 cyl 分顏色的,所以有 4, 5, 6, 7 四組,但是因為 5 的部分只有兩個點,所以其實沒有線的部分,當你把點的設定拿掉只剩趨勢線時,cyl 裡面 5 的那個就消失了。

我們再跳回圖 #6,如果圖 #6 沒設成 linear regression 的話,就是這樣:

#8
p1 + geom_point(aes(colour = factor(cyl))) +
     geom_smooth(aes(colour = factor(cyl)))



因為圖 #6 和圖 #8 在點和趨勢線的部分都有設 colour = factor(cyl),我們可以把第一層設成這樣:

p2 <- ggplot(mpg, aes(displ, hwy, colour = factor(cyl))
p2 + geom_point() +
     geom_smooth()

可以和圖 #4 相比較,圖四的趨勢線是設 cty 而不是 hwy,而圖 #8 因為沒在第二層 geom_smooth 指定另外的 variable,所以是依照第一層(p1)的 hwy 畫的趨勢線。

第四張圖如果同樣分層的話,會設成這樣:

p2 <- ggplot(mpg, aes(displ, hwy, colour = factor(cyl)))

p2 + geom_point() +
     geom_smooth(aes(y = cty))

看出來了嗎?這樣分層比較有沒有比較清楚了呢?

如果你想改趨勢線的顏色,跟前一篇介紹的一樣,要用 color = ' '

#9
p2 + geom_point() +
     geom_smooth(method = "lm", color = 'black')



在上圖中,因為把趨勢線設為黑色,所以覆蓋住第一層的 colour = factor(cyl),因此是依照 hwy 畫出的單一趨勢線,而非照 cyl 分開畫的線。

這個情況下,也可以用 grouping 的功能畫趨勢線,出來的結果會跟上面的圖 #9 相同,不需要設線的顏色。用的語法是 group =

p2 + geom_point() +
     geom_smooth(aes(group = 1), method = "lm")



再來,我們跳回圖 #7,如果我們想依 cyl 的參數畫趨勢線,但不想分顏色的話,也可以用 grouping 的功能。

#10
p1 + geom_point() +
     geom_smooth(aes(group = factor(cyl)), method = "lm")



接著,我們試試把 p2 的顏色換成用形狀表示:shape = ()

#11
p3 <- ggplot(mpg, aes(displ, hwy, shape = factor(cyl)))

p3 + geom_point() + geom_smooth(method = "lm")



用上面 p3 的設定,把趨勢線也依照 cyl 用顏色區分。

#12
p3 + geom_point() +
     geom_smooth(aes(colour = factor(cyl)), method = "lm")



可以讓圖更複雜,連點都用不同的 variables 分類。XD

p3 + geom_point(aes(colour = drv)) +
     geom_smooth(aes(colour = factor(cyl)), method = "lm")



最後,我們來嘗試一下繼續試一下 grouping,就是在圖。

用的檔案資料是 Oxboys,在 library(nlme) 裡面,下面比較身高和年齡的關係,然後用 Subject 來分類。

#13
ggplot(Oxboys,aes(age,height, colour = Subject)) +
              geom_point()



接下來,我們要用線條把相同的 Subject 連起來,也就是把同顏色的點用線連起來,所以需要用到 geom_line(),然後用 Subject 分組。這裡跟圖 #10 同樣用 group =

#14
ggplot(Oxboys,aes(age,height)) +
              geom_point(aes(colour = Subject)) +
              geom_line(aes(group = Subject), alpha = 0.3)



geom_line() 裡面的 alpha = 0.3 是指透明度,介於 0 和 1 之間,數字越小越透明(顏色越淡),可用在點和線,這個之後也會講到。

如果不用 group 的功能的話,可以像上面的方式一樣用 colour =

#15
ggplot(Oxboys,aes(age,height)) +
              geom_point() +
              geom_line(aes(colour = Subject), alpha = 0.6)




最後,來做個練習吧。

Using the gapminder dataset (library(gapminder)), make a line graph of life expectancy of each country over time. Colour countries by the continent.

ggplot(gapminder, aes(year, lifeExp))
       geom_line(aes(color = continent), alpha = 0.3) +
       geom_smooth(linetype = 2)



趨勢線的型態也可以用 linetype =  設定,有這幾種:

0 = blank, 1 = solid, 2 = dashed, 3 = dotted, 4 = dotdash, 5 = longdash, 6 = twodash

因此,也可以這樣設:geom_smooth(linetype = "dashed")