劉小澤開始寫于18.9.4晚,這必定是一個(gè)持續(xù)性更新的過程
昨天jimmy一發(fā)朋友圈,單篇閱讀量很快超過了我們的關(guān)注人數(shù)??開心之余,今晚拿起了數(shù)據(jù)科學(xué)這本書看了起來~正如書的安排,將第一部分分給了可視化,確實(shí)讓人耳目一新,學(xué)習(xí)R可視化并且用最好用的ggplot2工具,讓學(xué)習(xí)變成一種享受。
我會(huì)按學(xué)習(xí)的內(nèi)容梳理重點(diǎn)問題
前言

需要整潔的數(shù)據(jù)tidy data
每一列是一個(gè)變量,每一行是一個(gè)觀測
需要安裝tidyverse包
包括了ggplot2/tibble/readr/purrr/dplyr,使用tidyverse_update()檢查更新
指定對象
包的名稱后用兩個(gè)冒號,如dplyr::mutate()
ggplot繪圖
繪圖模版
ggplot(data = <DATA>) +
<GEOM_FUNCTION>(mapping = aes(<MAPPING>))
這個(gè)思路很棒!也講出了ggplot的作圖邏輯
- 無論什么圖,首先需要輸入的就是數(shù)據(jù)集
<DATA>,這時(shí)繪制的是一張白紙; - 接下來就看你需要做什么圖了,就是選擇幾何對象的過程,比如要做散點(diǎn)圖,就將
<GEOM_FUNCTION>替換成geom_point; - 有了幾何對象,接下來就要考慮,我們數(shù)據(jù)集中的數(shù)據(jù)怎么映射上去呢,x軸代表什么,y軸又代表什么呢?這個(gè)就是
<MAPPING>需要做的事情——指定映射變量; - 指定完變量后,就要想,怎么設(shè)置字體大小(size),形狀(shape)、【填充|邊框】顏色(fill | color)、透明度(alpha)等等,這些叫圖形屬性,也都是在
<GEOM_FUNCTION>中完成; - 繪制完一個(gè)圖層后,當(dāng)然可以繼續(xù)新加圖層,覆蓋到原來之上(比如這里的散點(diǎn)圖)
繪圖注意
-
不要將無序變量映射為有序圖形屬性,什么樣的變量就用什么樣的屬性
有序圖形屬性包括:size;無序?qū)傩园ǎ簊hape、size
進(jìn)行圖形屬性設(shè)置時(shí),有的屬性是有序的圖形屬性,比如size,就是它是和數(shù)據(jù)的大小順序有關(guān)的,反映出來的結(jié)果應(yīng)該是:數(shù)值越大,點(diǎn)的大小越大。
但是如果用一個(gè)無序的變量(比如mpg數(shù)據(jù)集中的class變量,它只是一個(gè)分類的作用)去映射size,結(jié)果就會(huì)根據(jù)不同類別的class表現(xiàn)大小,基本上結(jié)果是看不出來什么問題的ggplot(data = mpg)+ geom_point(mapping = aes(x = displ, y = hwy, size= class))

ggplot2最多同時(shí)使用6種形狀
-
繪圖模版的倒數(shù)第二條中,設(shè)置顏色用字符串,設(shè)置大小用毫米,設(shè)置形狀用數(shù)值。關(guān)于形狀:
空心-邊界顏色-color 【0-14】 實(shí)心-填充顏色-color;【15-20】 填充-邊界顏色-color,填充顏色-fill【21-24】

一行代碼寫不完,可以用+然后換行,但是+必須在結(jié)尾
圖形分面:特別適合添加分類變量
單個(gè)變量:facet_wrap(~變量,nrow=)
兩個(gè)變量:facet_grid(變量1~變量2)ggplot中有大于30種幾何對象,就是做出來的圖形,但是對于不用的圖進(jìn)行設(shè)置的屬性也有些差別,比如:帶線的圖就不能用點(diǎn)圖的shape設(shè)置形狀,可以用linetype設(shè)置實(shí)線、虛線等
show.legend=T/F設(shè)置是否顯示圖例-
創(chuàng)建表格可以用
demo <- tribble( ~a, ~b, "bar_1", 20, "bar_2", 30, "bar_3", 40) -
在<GEOM_FUNCTION>()中還可以添加統(tǒng)計(jì)變換
#stat_summary:匯總統(tǒng)計(jì),主要計(jì)算數(shù)據(jù)集合的最大值、最小值、平均數(shù)等; #stat_bin:封箱統(tǒng)計(jì),將數(shù)據(jù)劃分成一個(gè)個(gè)的區(qū)域,然后在外面嵌套匯總統(tǒng)計(jì); #stat_smooth:線性回歸、非線性回歸以及各種平滑插值算法,用于查找數(shù)據(jù)的規(guī)律; #stat_density:樣本估計(jì)總體的概率密度; -
位置調(diào)整position
#選項(xiàng)1.identity ggplot(diamonds,aes(x=cut, fill = clarity))+ geom_bar(position = "identity", alpha = 1/4) #設(shè)置透明度 ggplot(diamonds,aes(x=cut, color = clarity))+ geom_bar(position = "identity", fill=NA) #選擇不填充,也就是完全透明,只有邊框 #選項(xiàng)2.fill(和堆疊相似,但各組高度相同)方便比較比例 ggplot(diamonds, aes(x=cut, fill =clarity))+ geom_bar(position = "fill") #選項(xiàng)3.dodge(各組條形并列放置)方便比較數(shù)值 ggplot(diamonds, aes(x=cut, fill = clarity))+ geom_bar(position = "dodge", alpha=1/2) #選項(xiàng)4.適合散點(diǎn)圖的jitter(隨機(jī)抖動(dòng))避免因數(shù)據(jù)四舍五入而使部分值重疊 #不加抖動(dòng)是這樣 ggplot(mpg)+geom_point(aes(x= displ, y = hwy)) #加了是這樣,可以看出數(shù)據(jù)聚集模式 ggplot(mpg)+geom_point(aes(x= displ, y = hwy), position = "jitter") #快速實(shí)現(xiàn)用geom_jitter ggplot(mpg)+geom_jitter(aes(x= displ, y = hwy)) 作出一條參考線:對角線
geom_abline();水平geom_hline; 豎直geom_vline
基礎(chǔ)工作流
賦值
雖然=也可以,還是推薦使用<- 。因?yàn)?后來可能會(huì)引起混淆
快速輸入<-,用Alt +減號
對象名稱
小寫字母,_分隔
調(diào)取快捷鍵幫助
alt + shift + K
學(xué)習(xí)dplyr
五大金剛:
filter()按值篩選觀測值;arrange()行重排序;select()按名稱選取變量;mutate()使用現(xiàn)有變量創(chuàng)建新變量;summarize()獲得摘要
【工作方式:函數(shù)(數(shù)據(jù)框,變量名稱+操作) = 》結(jié)果返回新數(shù)據(jù)框】一種設(shè)定:group_by(),可以改變上述函數(shù)的作用范圍
#先加載參考數(shù)據(jù)集——航班概況
install.packages("nycflights13")
library(nycflights13)
filter
想同時(shí)輸出結(jié)果并保存在一個(gè)變量中,可以這樣:
(dec25 <- filter(flights, month == 1, day == 1))
比較數(shù)值—浮點(diǎn)數(shù)較特殊
> sqrt(2)^2 == 2
[1] FALSE
#計(jì)算機(jī)使用有限位數(shù)運(yùn)算,因此sqrt(2)^2結(jié)果是個(gè)近似值,要采用near函數(shù)來判斷
> near(sqrt(2)^2, 2)
[1] TRUE
邏輯運(yùn)算
#找到11月或者12月的航班
filter(flights, month == 11| month == 12)
#但是,如果這樣寫:
filter(flights, month == 11| 12) #結(jié)果大不同
# 因?yàn)槌绦蛳瓤吹氖?1 | 12,返回邏輯值是TRUE, 而TRUE代表數(shù)字1,因此結(jié)果就是相當(dāng)于 filter(flights, month == 1),會(huì)找到1月份的航班
NA == NA => NA
NA是什么?=》not available的缺失值
打眼看去,很奇怪的表達(dá),判斷NA == NA,怎么結(jié)果還是NA?
按現(xiàn)實(shí)情況去解釋就好理解了:豆豆的年齡未知(dou <- NA),花花的年齡也未知 (hua <- NA),那么豆豆花花的年齡一樣嗎(dou == hua?),不知道啊,所以還是NA
當(dāng)然,要判斷NA值,用is.na()
filter()默認(rèn)只保留TRUE的行,排除FALSE、NA,如果要保留NA,例如
filter(df, is.na(x) |x>1 )
簡寫 %in%
選出x是y中的一個(gè)值的所有行
filter(flights, month %in% c(11,12)) #就是上面的簡寫
簡化篩選條件
#如果要找出發(fā)或者到達(dá)延誤時(shí)間小于2小時(shí)的航班【兩種方法】
filter(flights, !(arr_delay >120 | dep_delay > 120))
filter(flights, arr_delay <= 120, dep_delay <=120)
另一個(gè)簡單的選取數(shù)據(jù)函數(shù)between()
可以用于選取數(shù)據(jù)范圍between(x, left, right)
參數(shù)left,right表示數(shù)據(jù)左邊和右邊范圍,返回結(jié)果是邏輯值
歡迎關(guān)注我們的公眾號~_~
我們是兩個(gè)農(nóng)轉(zhuǎn)生信的小碩,打造生信星球,想讓它成為一個(gè)不拽術(shù)語、通俗易懂的生信知識平臺(tái)。需要幫助或提出意見請后臺(tái)留言或發(fā)送郵件到Bioplanet520@outlook.com
