ggplot2箱式图两两比较_R语言进阶笔记2 | 长数据与ggplot2
1. 長數據是什么鬼?
之前介紹了如何將多個性狀的箱線圖放在一個圖上,比如learnasreml包中的fm數據,它有h1~h5五年的株高數據,想對它進行作圖。
「數據預覽:」
>?library(learnasreml)>?data(fm)
>?head(fm)
??TreeID?Spacing?Rep???Fam?Plot????dj????dm????wd?h1??h2??h3??h4??h5
1??80001???????3???1?70048????1?0.334?0.405?0.358?29?130?239?420?630
2??80002???????3???1?70048????2?0.348?0.393?0.365?24?107?242?410?600
3??80004???????3???1?70048????4?0.354?0.429?0.379?19??82?180?300?500
4??80005???????3???1?70017????1?0.335?0.408?0.363?46?168?301?510?700
5??80008???????3???1?70017????4?0.322?0.372?0.332?33?135?271?470?670
6??80026???????3???1?70002????2?0.359?0.450?0.392?30?132?258?390?570
這里,相對h1,h2,h3,h4,h5這五個性狀進行作圖,我們可以將其轉化為「長數據」!
問題來了,什么是「長數據」,什么是「寬數據」(不是短數據,這不是反義詞,謝謝)
「寬數據:」
?即變量是多列數據,每一列都是一個值,比如株高數據,第一年的株高是一列,第二年的株高是一列,第三年的株高是一列,這些數據就是寬數據。
?| ID001 | 12 | 14 | 18 |
| ID002 | 11 | 14 | 19 |
| ID003 | 14 | 15 | 16 |
「長數據:」
?即變量是,數據都在一列,比如株高數據,第一列是ID,第二列是年份,第三列是株高,這種數據叫長數據。
?| ID001 | 2018 | 12 |
| ID001 | 2019 | 14 |
| ID001 | 2020 | 18 |
| ID002 | 2018 | 11 |
| ID002 | 2019 | 14 |
| ID002 | 2020 | 19 |
| ID003 | 2018 | 14 |
| ID003 | 2019 | 15 |
| ID003 | 2020 | 16 |
「tidyverse」系列包,喜歡長數據,無論是清洗數據,還是匯總統計,還是ggplot2可視化,都喜歡長數據。
?飛哥注:我今天明白了這個道理,即tidyverse系列喜歡長數據,感覺打開了任督二脈,對于數據處理又有了新的理解。
?2. 怎么轉化為長數據
我知道三種方法:
- reshape2的melt函數,現在還知道這個包的人,R齡應該在5年以上了,反正我一直都用,很好用,但是被作者嫌棄了,現在被很多人嫌棄了……
- data.table的metlt函數,和reshape2包的函數同名,用法也相似,可以對DT數據處理,很快。現在我用melt函數時,就不用載入reshape2了,直接用data.table包就行
- tidyverse中的tidyr中的pivot_longer函數,這個更簡單,用過這個函數,再也沒有迷路過。因為melt函數語法比較復雜,經常需要查看幫助文檔或者以前的筆記。
看一下最簡單的方法吧,看一下數據:
>?dd?=?fm[,c(1,9:13)]>?head(dd)
??TreeID?h1??h2??h3??h4??h5
1??80001?29?130?239?420?630
2??80002?24?107?242?410?600
3??80004?19??82?180?300?500
4??80005?46?168?301?510?700
5??80008?33?135?271?470?670
6??80026?30?132?258?390?570
然后用pivot_longer函數,將其轉化為長數據:
>?re?=?dd?%>%?pivot_longer(.,-1,names_to?=?"Year",values_to?=?"Height")?>?head(re)
#?A?tibble:?6?x?3
??TreeID?Year??Height
??????
1?80001??h1????????29
2?80001??h2???????130
3?80001??h3???????239
4?80001??h4???????420
5?80001??h5???????630
6?80002??h1????????24
代碼解釋:
- 我用了管道符%/%,將數據傳遞給pivot_longer
- 第二個-1,意思是除了第一個不處理,其它都處理,也可以用2:6表示第二到第六列處理
- 第三個names_to是變量的名稱,這里定義為Year
- 第四個values_to是保存的性狀名,這里是Height
可以看到,長數據有3列,分別是:
- TreeID
- Year
- Height
3. ggplot2作圖怎么搞
之前我使用ggplot2作圖時,想做什么圖,就在網上copy代碼,然后根據自己的數據名稱,修改代碼,然后運行代碼。一次性代碼,用過就忘,半吊子水平,一直很穩定。
當我知道了ggplot2用長數據之后,又是另一種理解:
library(ggplot2)re?%>%?ggplot(.,aes(x?=?Year,?y?=?Height,?colour?=?Year))?+?geom_boxplot()
先看圖片:
成功了,圖片比較滿意,第一個是h1的株高,第二個是h2的株高,依次類推。但是代碼是什么意思呢?
我看了ggplot2的入門,畫圖分為三個部分:
- 數據在哪里:re是數據
- x軸,y軸在哪里:x軸是Year,y軸是Height
- 畫什么類型的圖:這里是箱線圖,所以是geom_boxplot
「如果是畫分組散點圖:」
re?%>%?ggplot(.,aes(x?=?Year,?y?=?Height,?colour?=?Year))?+?geom_point()「如果是畫分組分散的散點圖:」
re?%>%?ggplot(.,aes(x?=?Year,?y?=?Height,?colour?=?Year))?+?geom_jitter()4. 所以散點圖和箱線圖結合呢?
直接用+連接就行了,感覺到了畫家作圖的快樂,算是丫丫學徒吧,哈哈
re?%>%?ggplot(.,aes(x?=?Year,?y?=?Height,?colour?=?Year))?+??geom_jitter()?+?geom_boxplot()5. 感受
所以,這就是學習的快樂了!
R語言進階筆記1 | 深挖一門語言的必要性
總結
以上是生活随笔為你收集整理的ggplot2箱式图两两比较_R语言进阶笔记2 | 长数据与ggplot2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 历届世界杯举办地有哪些
- 下一篇: 电脑qq收藏怎么删除怎么恢复(电脑qq收