2019年5月17日 星期五

在 R 上繪製雙 Y 軸的圖

markdown
有時候為了方便比較或者節省空間,將數筆不一樣的資料繪製在一張圖上,讓人比較容易一目瞭然,對於整個資料狀況的理解也會比較快速。

在 R 裡面,就我所了解的情況,目前 R 似乎還沒有 package 可以支援繪製雙 Y 軸圖。不過也並非沒有辦法解決,這裡以溫度趨勢與香草開花的關係圖來嘗試繪製雙 Y 軸圖。

```
temp_pol_2018 <- read.table("clipboard", header = T, sep = "\t")
temp_pol_2018$date <- as.Date(temp_pol_2018$date)
temp_pol_2018$temp <- as.numeric(temp_pol_2018$temp)
temp_pol_2018$pollination<-as.numeric(temp_pol_2018$pollination)
```

利用複製貼上的方式將 excel 的資料轉換至 R 裡面,date 為日期,轉換為日期格式。temp 為溫度、pollination 為授粉花數,轉換為數字格式。

```
library(ggplot2)
ggplot(temp_pol_2018) +
  geom_line(aes(date, temp)) +
  geom_bar(aes(date, pollination), stat = "identity") +
  scale_x_date(date_breaks = "month") +
  scale_y_continuous(name = expression("Temperature ("~degree~"C)"), sec.axis = sec_axis(~., name = "number of fertilized flowers")) +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5))
```
使用 ggplot2 的 package 來繪圖,geom_line 繪製溫度與日期的線圖,geom_bar 繪製授粉花數與日期的長條圖,用 sec.axis 強制畫上第二 Y 軸。可以看見 Y 軸的數字被溫度的數字給固定住了,這時候只好使用數字上的計算來修改。

授粉花數的數字比溫度小,將授粉花數的數據乘以 2,讓圖形放大符合第一 Y 軸區間。最後記得把第二 Y 軸的顯示數據除以 2 回來。

```
ggplot(temp_pol_2018) +
  geom_line(aes(date, temp)) +
  geom_bar(aes(date, pollination*2), stat = "identity") +
  scale_x_date(date_breaks = "month") +
  scale_y_continuous(name = expression("Temperature ("~degree~"C)"), limits = c(0, 30), sec.axis = sec_axis(~. /2, name = "number of fertilized flowers")) +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5))
```
這樣圖稍微好看一點了。
接著來看第二份資料。

```
temp_pol_2019 <- read.table("clipboard", header = T, sep = "\t")
temp_pol_2019$date <- as.Date(temp_pol_2019$date)
temp_pol_2019$temp <- as.numeric(temp_pol_2019$temp)
temp_pol_2019$pollination <-as.numeric(temp_pol_2019$pollination)

ggplot(temp_pol_2019) +
  geom_line(aes(date, temp)) +
  geom_bar(aes(date, pollination), stat = "identity") +
  scale_x_date(date_breaks = "month") +
  scale_y_continuous(name = expression("Temperature ("~degree~"C)"), sec.axis = sec_axis(~., name = "number of fertilized flowers")) +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5))
```
授粉花數最多達 736 朵,整個 Y 軸被拉高,使得溫度趨勢變得不明顯,一樣在數字的計算上動個手腳。這次授粉花數較多,將其除以 25,記得最後 Y 軸標示要乘以 25 回來。

```
ggplot(temp_pol_2019) +
  geom_line(aes(date, temp)) +
  geom_bar(aes(date, pollination/25), stat = "identity") +
  scale_x_date(date_breaks = "month") +
  scale_y_continuous(name = expression("Temperature ("~degree~"C)"), limit = (0, 30), sec.axis = sec_axis(~.*25, name = "number of fertilized flowers")) +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5))
```
這樣圖好看多了。

把 2018 年的數據與 2019 年的數據一起比較,2019 年冬季溫度偏高,每日均溫在攝氏 15 度以上,2018 年冬季低溫可以到 10 度。2019 年開花可以授粉的時間提前到 4 月,2018 年開花授粉的時間在 5 月,可以合理推論香草開花的時間與溫度具有一定程度的關係。

沒有留言:

張貼留言

<房市老手21堂超強實戰課:快速看穿房屋買賣陷阱>閱讀筆記

https://www.taaze.tw/apredir.html?131322949/https://www.taaze.tw/products/11100982076.html?a=b 賣房篇 1.      頂樓加蓋對於房價 頂樓加蓋還是可以計入房價,多為房屋單坪價格的 1...