劉小澤開始寫于18.9.4晚,這必定是一個持續性更新的過程
昨天jimmy一發朋友圈,單篇閱讀量很快超過了我們的關注人數??開心之余,今晚拿起了數據科學這本書看了起來~正如書的安排,將第一部分分給了可視化,確實讓人耳目一新,學習R可視化并且用最好用的ggplot2工具,讓學習變成一種享受。
我會按學習的內容梳理重點問題
前言
需要整潔的數據tidy data
每一列是一個變量,每一行是一個觀測
需要安裝tidyverse包
包括了ggplot2/tibble/readr/purrr/dplyr
,使用tidyverse_update()檢查更新
指定對象
包的名稱后用兩個冒號,如dplyr::mutate()
ggplot繪圖
繪圖模版
ggplot(data = <DATA>) +
<GEOM_FUNCTION>(mapping = aes(<MAPPING>))
這個思路很棒!也講出了ggplot的作圖邏輯
- 無論什么圖,首先需要輸入的就是數據集
<DATA>
,這時繪制的是一張白紙; - 接下來就看你需要做什么圖了,就是選擇幾何對象的過程,比如要做散點圖,就將
<GEOM_FUNCTION>
替換成geom_point; - 有了幾何對象,接下來就要考慮,我們數據集中的數據怎么映射上去呢,x軸代表什么,y軸又代表什么呢?這個就是
<MAPPING>
需要做的事情——指定映射變量; - 指定完變量后,就要想,怎么設置字體大小(size),形狀(shape)、【填充|邊框】顏色(fill | color)、透明度(alpha)等等,這些叫圖形屬性,也都是在
<GEOM_FUNCTION>
中完成; - 繪制完一個圖層后,當然可以繼續新加圖層,覆蓋到原來之上(比如這里的散點圖)
繪圖注意
-
不要將無序變量映射為有序圖形屬性,什么樣的變量就用什么樣的屬性
有序圖形屬性包括:size;無序屬性包括:shape、size
進行圖形屬性設置時,有的屬性是有序的圖形屬性,比如size,就是它是和數據的大小順序有關的,反映出來的結果應該是:數值越大,點的大小越大。
但是如果用一個無序的變量(比如mpg數據集中的class變量,它只是一個分類的作用)去映射size,結果就會根據不同類別的class表現大小,基本上結果是看不出來什么問題的ggplot(data = mpg)+ geom_point(mapping = aes(x = displ, y = hwy, size= class))
ggplot2最多同時使用6種形狀
-
繪圖模版的倒數第二條中,設置顏色用字符串,設置大小用毫米,設置形狀用數值。關于形狀:
空心-邊界顏色-color 【0-14】 實心-填充顏色-color;【15-20】 填充-邊界顏色-color,填充顏色-fill【21-24】
一行代碼寫不完,可以用+然后換行,但是+必須在結尾
圖形分面:特別適合添加分類變量
單個變量:facet_wrap(~變量,nrow=)
兩個變量:facet_grid(變量1~變量2)
ggplot中有大于30種幾何對象,就是做出來的圖形,但是對于不用的圖進行設置的屬性也有些差別,比如:帶線的圖就不能用點圖的shape設置形狀,可以用linetype設置實線、虛線等
show.legend=T/F
設置是否顯示圖例-
創建表格可以用
demo <- tribble( ~a, ~b, "bar_1", 20, "bar_2", 30, "bar_3", 40)
-
在<GEOM_FUNCTION>()中還可以添加統計變換
#stat_summary:匯總統計,主要計算數據集合的最大值、最小值、平均數等; #stat_bin:封箱統計,將數據劃分成一個個的區域,然后在外面嵌套匯總統計; #stat_smooth:線性回歸、非線性回歸以及各種平滑插值算法,用于查找數據的規律; #stat_density:樣本估計總體的概率密度;
-
位置調整position
#選項1.identity ggplot(diamonds,aes(x=cut, fill = clarity))+ geom_bar(position = "identity", alpha = 1/4) #設置透明度 ggplot(diamonds,aes(x=cut, color = clarity))+ geom_bar(position = "identity", fill=NA) #選擇不填充,也就是完全透明,只有邊框 #選項2.fill(和堆疊相似,但各組高度相同)方便比較比例 ggplot(diamonds, aes(x=cut, fill =clarity))+ geom_bar(position = "fill") #選項3.dodge(各組條形并列放置)方便比較數值 ggplot(diamonds, aes(x=cut, fill = clarity))+ geom_bar(position = "dodge", alpha=1/2) #選項4.適合散點圖的jitter(隨機抖動)避免因數據四舍五入而使部分值重疊 #不加抖動是這樣 ggplot(mpg)+geom_point(aes(x= displ, y = hwy)) #加了是這樣,可以看出數據聚集模式 ggplot(mpg)+geom_point(aes(x= displ, y = hwy), position = "jitter") #快速實現用geom_jitter ggplot(mpg)+geom_jitter(aes(x= displ, y = hwy))
作出一條參考線:對角線
geom_abline()
;水平geom_hline
; 豎直geom_vline
基礎工作流
賦值
雖然=
也可以,還是推薦使用<-
。因為=后來可能會引起混淆
快速輸入<-
,用Alt +減號
對象名稱
小寫字母,_
分隔
調取快捷鍵幫助
alt + shift + K
學習dplyr
五大金剛:
filter()按值篩選觀測值;arrange()行重排序;select()按名稱選取變量;mutate()使用現有變量創建新變量;summarize()獲得摘要
【工作方式:函數(數據框,變量名稱+操作) = 》結果返回新數據框】一種設定:group_by(),可以改變上述函數的作用范圍
#先加載參考數據集——航班概況
install.packages("nycflights13")
library(nycflights13)
filter
想同時輸出結果并保存在一個變量中,可以這樣:
(dec25 <- filter(flights, month == 1, day == 1))
比較數值—浮點數較特殊
> sqrt(2)^2 == 2
[1] FALSE
#計算機使用有限位數運算,因此sqrt(2)^2結果是個近似值,要采用near函數來判斷
> near(sqrt(2)^2, 2)
[1] TRUE
邏輯運算
#找到11月或者12月的航班
filter(flights, month == 11| month == 12)
#但是,如果這樣寫:
filter(flights, month == 11| 12) #結果大不同
# 因為程序先看的是11 | 12,返回邏輯值是TRUE, 而TRUE代表數字1,因此結果就是相當于 filter(flights, month == 1),會找到1月份的航班
NA == NA => NA
NA是什么?=》not available的缺失值
打眼看去,很奇怪的表達,判斷NA == NA,怎么結果還是NA?
按現實情況去解釋就好理解了:豆豆的年齡未知(dou <- NA),花花的年齡也未知 (hua <- NA),那么豆豆花花的年齡一樣嗎(dou == hua?),不知道啊,所以還是NA
當然,要判斷NA值,用is.na()
filter()默認只保留TRUE的行,排除FALSE、NA,如果要保留NA,例如
filter(df, is.na(x) |x>1 )
簡寫 %in%
選出x是y中的一個值的所有行
filter(flights, month %in% c(11,12)) #就是上面的簡寫
簡化篩選條件
#如果要找出發或者到達延誤時間小于2小時的航班【兩種方法】
filter(flights, !(arr_delay >120 | dep_delay > 120))
filter(flights, arr_delay <= 120, dep_delay <=120)
另一個簡單的選取數據函數between()
可以用于選取數據范圍between(x, left, right)
參數left,right表示數據左邊和右邊范圍,返回結果是邏輯值
歡迎關注我們的公眾號~_~
我們是兩個農轉生信的小碩,打造生信星球,想讓它成為一個不拽術語、通俗易懂的生信知識平臺。需要幫助或提出意見請后臺留言或發送郵件到Bioplanet520@outlook.com