一览R基础包的六个高级绘图函数(盒型boxplot|条形barplot|直方hist|饼pie|dotchart|coplot)...
????除了數(shù)理統(tǒng)計(jì),今天我們繼續(xù)聊一下R語言的另一個(gè)任務(wù):繪圖。
????注意:我們公眾號(hào)的每一次發(fā)文盡量列出一個(gè)小系列。如果九陽神功有10層,能以一篇文章寫10層,絕不一篇寫一層、分散寫10篇,追求字典、工具的性質(zhì)。
????經(jīng)常畫圖的熟練操作工應(yīng)該背誦出每一個(gè)細(xì)節(jié),故適合反復(fù)、強(qiáng)化練習(xí)少量的幾篇。但每一篇的篇幅難免有所限制。
????此文的代碼讀者可直接復(fù)制、粘貼、套用,是此文的一點(diǎn)價(jià)值。其實(shí)關(guān)于繪圖聊生信公眾號(hào)前幾篇有個(gè)更基礎(chǔ)的文章:《R語言簡(jiǎn)介、安裝、R包的安裝問題、R的繪圖函數(shù)概覽、par()函數(shù)及plot()函數(shù)詳解》(在這篇的內(nèi)容有所理解之前請(qǐng)不要看今天這篇。九陽神功跳過1-3層直接練習(xí)第九層?有點(diǎn)虎了)。
? ? 目前網(wǎng)絡(luò)、自媒體上已經(jīng)有大量的R繪圖教程,那么先問一個(gè)小問題:R的繪圖函數(shù)到底有幾層,有多少種?好吧,我們直接復(fù)習(xí):
基礎(chǔ)繪圖包包括 :高級(jí)繪圖函數(shù)和低級(jí)繪圖函數(shù)。plot()函數(shù)是不是特別簡(jiǎn)單?其實(shí)它是基礎(chǔ)繪圖包中的高級(jí)繪圖函數(shù)。基礎(chǔ)繪圖包在R語言被安裝后即存在,可直接使用,永不升級(jí)。基礎(chǔ)繪圖包不算Low,很多CNS文章仍在使用。”鉆石恒久遠(yuǎn)、經(jīng)典永留存“,所謂顏值不在于繪圖包是否高級(jí),主要在于線條的粗細(xì)、精心的排版、文字與圖形之間的比例、以及有點(diǎn)兒"品位"的顏色搭配。
基礎(chǔ)繪圖包中的高級(jí)繪圖函數(shù),包括:plot()泛型函數(shù)(generic method)、boxplot()盒型圖、barplot()條形圖、hist()直方圖或金字塔圖、pie()餅圖、dotchart()克利夫蘭點(diǎn)圖和coplot()條件圖等(后兩個(gè)有些冷門)。這里有一個(gè)實(shí)踐過程中容易混淆的地方:大部分par()函數(shù)的參數(shù)(即:函數(shù)中的參數(shù),不是低級(jí)繪圖函數(shù))不僅可以自己使用,也可以直接在上述其它高級(jí)繪圖函數(shù)中使用,效果等同于在par()中使用(par是什么?看我們之前的一篇的文章:點(diǎn)我)。一些參數(shù)只能在par()中使用,高級(jí)繪圖函數(shù)無法實(shí)現(xiàn)其功能,如: ask; fig; fin; lheight; mai; mar; mfcol; mfrow; mfg; new; oma; omd; omi; pin; plt; ps; pty; usr; xlog; ylog等(注意:這些是函數(shù)內(nèi)部的參數(shù),不是函數(shù))。
基礎(chǔ)繪圖包中的低級(jí)繪圖函數(shù),無法(憑空)繪圖,即只有在高級(jí)繪圖函數(shù)繪制出來的圖形中有效,如:text()加文本, legned()加圖例, axis()繪制坐標(biāo)軸, points()加散點(diǎn), titles()加標(biāo)題, arrows()加箭頭, box()繪制圖形邊框, abline()加直線, clip()修剪圖形, locator()識(shí)別圖中的點(diǎn)的坐標(biāo), layout()切分畫布, lines()加線條, segments()加線段, rug()加小地毯, polygon()構(gòu)建多邊形, mtext()在圖形四周添加文字, grid()添加背景網(wǎng)格線。
高級(jí)繪圖包(注意與基礎(chǔ)繪圖包的高級(jí)繪圖函數(shù)是兩碼事兒),包括ggplot2包、maps包、曼哈頓圖等。這些包需要額外安裝、加載,且必須與R的版本相匹配,也可能互相依賴,故經(jīng)常出現(xiàn)版本不可用的問題。最新版的R可能已經(jīng)自帶一些高級(jí)繪圖包,但不全。你也可以開發(fā)一個(gè)新的、風(fēng)靡學(xué)界的高級(jí)繪圖包,并留上你的名字等印記,順帶著發(fā)個(gè)SCI,不用買試劑、做實(shí)驗(yàn),一樣可以被高引用、對(duì)科學(xué)有所貢獻(xiàn)。高級(jí)繪圖包單獨(dú)作為一個(gè)系列放在聊生信公眾號(hào)后續(xù)的文章中。
????需要特別指出的是,基礎(chǔ)繪圖包中的高級(jí)繪圖函數(shù)plot() 是泛型函數(shù),可以理解成一個(gè)函數(shù)族。當(dāng)我們調(diào)用這個(gè)函數(shù)時(shí),plot()會(huì)自動(dòng)識(shí)別傳入的數(shù)據(jù)或參數(shù)所屬的類,然后調(diào)用對(duì)應(yīng)的子函數(shù)來作圖。那么plot()有哪些子函數(shù)?如下:
methods(plot)## [1] plot.acf* plot.data.frame* plot.decomposed.ts* ## [4] plot.default plot.dendrogram* plot.density* ## [7] plot.ecdf plot.factor* plot.formula* ## [10] plot.function plot.hclust* plot.histogram* ## [13] plot.HoltWinters* plot.isoreg* plot.lm* ## [16] plot.medpolish* plot.mlm* plot.ppr* ## [19] plot.prcomp* plot.princomp* plot.profile.nls* ## [22] plot.raster* plot.spec* plot.stepfun ## [25] plot.stl* plot.table* plot.ts ## [28] plot.tskernel* plot.TukeyHSD* ## see '?methods' for accessing help and source code一、利用基礎(chǔ)繪圖包的高級(jí)繪圖函數(shù)——boxplot()繪制盒型圖(或叫箱線圖)
????生成一個(gè)隨機(jī)數(shù):
rnorm(40) # rnorm()函數(shù)用于生成一個(gè)數(shù)值向量,其中的數(shù)值符合正態(tài)分布(隨機(jī)生成);默認(rèn)mean = 0, sd = 1,即平均值為0,標(biāo)準(zhǔn)差為1## [1] 0.73359740 -0.32093259 0.05099123 -1.14747108 -0.29760444 -0.19115771 ## [7] -0.18050401 -0.65705753 -0.58041793 -0.18732920 0.25136324 1.80564477 ## [13] -0.30739795 1.72920486 -1.24785193 -0.06134842 0.29841122 0.29935828 ## [19] 0.60156069 0.80647689 0.44584861 -0.10413528 -1.61214793 -2.21374982 ## [25] -0.13816031 -0.03873687 -0.87576900 -0.01112754 -0.57068791 -0.04539396 ## [31] 1.63399958 -0.17046456 -0.18404878 0.65711950 1.99138871 -0.29185956 ## [37] -0.62310740 0.83584807 1.11986269 -0.58150804? ? 附加一些關(guān)于數(shù)據(jù)的統(tǒng)計(jì)知識(shí):
????一個(gè)由多個(gè)數(shù)值組成的數(shù)值向量,一般具有:平均值、最大值、最小值、中值(又稱中位數(shù),是指將統(tǒng)計(jì)總體當(dāng)中的各個(gè)變量值按大小順序排列起來,形成一個(gè)數(shù)列,處于變量數(shù)列中間位置的變量值就稱為中位數(shù))、方差等。這些統(tǒng)計(jì)值用來反映數(shù)據(jù)的總體特征。
????四分位數(shù)是通過3個(gè)點(diǎn)將全部數(shù)據(jù)等分為4部分,其中每部分包含25%的數(shù)據(jù)。很顯然,中間的四分位數(shù)就是中位數(shù),因此通常所說的四分位數(shù)是指處在25%位置上的數(shù)值(稱為下四分位數(shù))和處在75%位置上的數(shù)值(稱為上四分位數(shù))。
????所謂統(tǒng)計(jì)學(xué)中的箱線圖(box plot)就是對(duì)四分位數(shù)的繪圖。
????所謂正態(tài)分布(Normal distribution),也稱“常態(tài)分布”,又名高斯分布(Gaussian distribution)。若隨機(jī)變量X服從一個(gè)數(shù)學(xué)期望為μ、方差為σ2的正態(tài)分布,則記為N(μ,σ2)。正態(tài)分布的期望值μ決定了其概率密度圖的位置,標(biāo)準(zhǔn)差σ決定了分布的幅度。當(dāng)μ = 0, σ = 1時(shí)的正態(tài)分布是標(biāo)準(zhǔn)正態(tài)分布N(0,1)。
boxplot(rnorm(40)) # 繪制一組符合正態(tài)分布的隨機(jī)數(shù)據(jù)的盒型圖,rnorm()函數(shù)用于產(chǎn)生服從標(biāo)準(zhǔn)正態(tài)分布N(0,1)的隨機(jī)數(shù),我們此時(shí)產(chǎn)生了40個(gè)。跟上圖完全一樣的代碼再畫一次圖,然后比較這兩個(gè)圖的區(qū)別:
boxplot(rnorm(40))
????上述代碼如果多運(yùn)行幾次,會(huì)發(fā)現(xiàn):同樣的代碼,每次獲得的圖形略有不同。比如:坐標(biāo)軸刻度;箱線圖的最上面和最下面(胡須):有時(shí)候有小原點(diǎn)(異常值),有時(shí)候沒有。每次獲得的圖形不同,是因?yàn)槊看潍@得了不同的隨機(jī)數(shù)。若想保證多次取到同一組隨機(jī)數(shù)(利于代碼、繪圖的可重復(fù)性),則需要設(shè)置隨機(jī)數(shù)種子set.seed(100)。
????另外,若想控制箱線圖的最上面和最下面(胡須)附近的小原點(diǎn)(異常值),可設(shè)置boxplot的range參數(shù):
par(mfrow=c(1,4)) set.seed(100) # 設(shè)置隨機(jī)數(shù)種子,以保證多次取到同一組隨機(jī)數(shù),利于代碼的可重復(fù)性。 data=rnorm(100) # 產(chǎn)生100個(gè)服從標(biāo)準(zhǔn)正態(tài)分布的隨機(jī)數(shù) boxplot(data, range=0, xlab='range is 0', col='skyblue') # range為范圍函數(shù),表示覆蓋本體極端值間距的倍數(shù)(即:決定箱線圖最上沿及最下沿對(duì)箱體的覆蓋區(qū)域)。 # range: this determines how far the plot whiskers extend out from the box. If range is positive, the whiskers extend to the most extreme data point which is no more than range times the interquartile range from the box. A value of zero causes the whiskers to extend to the data extremes. boxplot(data, range=0.5,xlab='range is 0.5',col='skyblue') boxplot(data, range=1, xlab='range is 1', col='skyblue') boxplot(data, range=2, xlab='range is 2', col='skyblue')##相關(guān)參數(shù)介紹: # width設(shè)置box相對(duì)寬度;boxwex設(shè)置box寬度,取值越大盒子越寬 # outline邏輯參數(shù),是否繪制離群點(diǎn),默認(rèn)為T,即繪制離群點(diǎn) # notch邏輯參數(shù),是否使用卡槽,默認(rèn)為F # names設(shè)置盒型圖中各個(gè)box的標(biāo)簽(并不是這整個(gè)盒型圖的標(biāo)簽) # horizontal邏輯參數(shù),是否橫向放置盒型圖,默認(rèn)為F,即縱向放置 # add邏輯參數(shù),是否將盒型圖添加到現(xiàn)有圖形上 # at配合add使用,該盒型圖的橫坐標(biāo)位置的定義 # 建議每次看繚亂的代碼之前,先細(xì)看后面畫出的圖,更容易看懂代碼 boxplot(len~dose,#繪制變量len與dose的盒型圖(前者為連續(xù)型變量,后者是分類變量)data=ToothGrowth,#使用R語言內(nèi)置數(shù)據(jù)集ToothGrowthboxwex=0.3,at=1:3-0.2,#at參數(shù)定義了圖中盒子橫坐標(biāo)位置為0.8,1.8,2.8subset=supp=="VC",#采集ToothGrowth中supp為VC的數(shù)據(jù),即此處只繪制VC數(shù)據(jù)col="yellow",names=c('dose=0.5','dose=1.0','dose=2.0'),main="Tooth Growth",xlab="C dose mg",ylab="tooth length",xlim=c(0.5,3.5),ylim=c(0,35),yaxs="i") boxplot(len~dose,data=ToothGrowth,add=TRUE,boxwex=0.3,at=1:3+0.2,names=c('dose=0.5','dose=1.0','dose=2.0'),subset=supp=="OJ",col="orange") legend(2.5, 9, c("Ascorbic acid", "Orange juice"),fill = c("yellow", "orange")) # legned()為低級(jí)繪圖函數(shù): 加圖例 names=c(rep("Maestro",20),rep("Presto",20),rep("Nerak",20),rep("Eskimo",20),rep("Nairobi",20),rep("Artiko",20))value=c(sample(3:10,20,replace=T),sample(2:5,20,replace=T),sample(6:10,20,replace=T),sample(6:10,20,replace=T),sample(1:7,20,replace=T),sample(3:10,20,replace=T))data=data.frame(names,value)data$names = as.factor(data$names) #這是十分關(guān)鍵的一步!——將data中的names數(shù)據(jù)由向量屬性(vector)改為因子屬性(factor) #由于data中默認(rèn)所有數(shù)據(jù)均為向量屬性,而boxplot函數(shù)只可以識(shí)別factor,若不手動(dòng)更改其屬性,則以下代碼將無法正常運(yùn)行。 #tips:R擁有許多用于存儲(chǔ)數(shù)據(jù)的對(duì)象類型,包括標(biāo)量、向量、矩陣、數(shù)組、數(shù)據(jù)框、列表及因子。boxplot(data$value~data$names,col=ifelse(levels(data$names)=="Nairobi","lightblue",ifelse(levels(data$names)=="Eskimo","mediumpurple3","grey75")),ylab="disease",xlab="- variety -")#這里出現(xiàn)了一個(gè)新函數(shù)!記得拿出小本本積累下來~~ifelse()使用方法為:ifelse(test, yes, no)。若輸入"test"成立,則輸出"yes",不成立則輸出"no" #在這里表示,若names=Nairobi,則將其顯示為"lightblue",若names≠Nairobi,則進(jìn)行第二次ifelse函數(shù)判斷。(即若names=Eskimo,則將其輸出為"mediumpurple3",若names≠Eskimo,則輸出為"grey75")#盒型圖默認(rèn)按照所給數(shù)據(jù)名稱首字母進(jìn)行排序,如何根據(jù)其他指標(biāo)對(duì)盒型進(jìn)行排序,讓圖形更美觀呢? #這里以各box中數(shù)據(jù)中位數(shù)排序舉例: data$names = as.factor(data$names) data$value = as.numeric(data$value) order_names <- with(data,reorder(names,value,median,na.rm=TRUE)) #對(duì)names進(jìn)行重新排序,標(biāo)準(zhǔn)為median(value),即value中位數(shù)。 boxplot(data$value~order_names,col='salmon',ylab="disease",xlab="- variety -")#新函數(shù)reorder()使用方法:reorder(x,y,z),x為需要重排的因子變量,y為排序標(biāo)準(zhǔn),z為函數(shù)名稱二、利用基礎(chǔ)繪圖包的高級(jí)繪圖函數(shù)——barplot()繪制條形圖(或叫直方圖)
##相關(guān)參數(shù)介紹: # height:用于設(shè)置條形高度 # width:用于設(shè)置條柱寬度,默認(rèn)為1 # space:用于設(shè)置條柱間隔 # names.arg:用于設(shè)置條形圖標(biāo)簽,即自定義各條帶名稱 # horiz:邏輯參數(shù),是否使用水平條柱 # plot:邏輯參數(shù),是否畫圖 # add:邏輯參數(shù),是否將條形圖添加到現(xiàn)有的圖形上data <- sample(c(10:100),10)#生成10個(gè)10-100之間的隨機(jī)整數(shù) barplot(data,col=rainbow(10,s=0.5))#將這10個(gè)隨機(jī)數(shù)傳入barplot()函數(shù),使用rainbow()內(nèi)置函數(shù)生成彩虹色,并將飽和度s調(diào)至0.5set.seed(10) par(mfrow=c(1,3), cex.main=2) my_matrix <- matrix(data = sample(10:50,9),nrow = 3,dimnames = list(c('A','B','C'),paste(1:3))) #生成一個(gè)3行3列的矩陣,行名(dimnames)為、B、C,列名(paste)為1、2、3barplot(my_matrix,beside = T,col=c('rosybrown',' wheat','seashell'),main = '原始條形圖') #beside參數(shù)表示是否將條柱平行放置,若為F則堆棧放置 barplot(t(my_matrix),beside = T,col=c('rosybrown',' wheat','seashell'),main = '行列互換后條形圖') #t()函數(shù)為專置函數(shù),即將矩陣行列進(jìn)行互換barplot(t(my_matrix),beside = F,col=c('rosybrown',' wheat','seashell'),main = '堆棧放置')par(mfrow=c(2,2),bg='navajowhite') average_gdp <- c(10000,8000,13000,9200) country <- c('China','Korea','Japan','Singapore') #構(gòu)造一個(gè)數(shù)據(jù),用于表示四個(gè)國(guó)家人均GDP。barplot(average_gdp,names.arg = country,col=heat.colors(4)) #為每一個(gè)條柱添加標(biāo)簽#heat.colors()函數(shù)為生成一個(gè)從紅色漸變到黃色再到白色的暖色系。 barplot(average_gdp,names.arg = country,horiz = TRUE,col=heat.colors(4)) #horiz = TRUE設(shè)置水平放置條圖 barplot(average_gdp,names.arg = country,horiz = FALSE,width = c(0.4,0.6,0.8,1.0),col=heat.colors(4)) #width設(shè)置條柱寬度 barplot(average_gdp,names.arg = country,horiz = FALSE,space = 0,col=heat.colors(4))#space設(shè)置條柱間隔添加誤差條
set.seed(20) par(mfrow=c(1,2),bg='ivory') data <- data.frame(doseA = rnorm(100,10,2),doseB = rnorm(100,13,5),doseC = rnorm(100,8,3)) #構(gòu)建一個(gè)隨機(jī)數(shù)據(jù)集,該數(shù)據(jù)集包含三個(gè)變量,分別表示三種不同的藥物劑量下,小鼠的某種生理指標(biāo)的變化水平,每一組均含有100個(gè)研究對(duì)象。 #rnorm(100,10,2)為隨機(jī)取100個(gè)值,平均值為10,方差為2 #r這列代表隨機(jī),可以替換成dnorm, pnorm, qnorm 作不同計(jì)算 #r = random = 隨機(jī), d= density = 密度, p= probability = 概率 , q =quantile = 分位data_mean <- apply(data,2,mean)#生成每一組的平均數(shù) #新函數(shù)apply()表示將data數(shù)據(jù)中第2列取平均值。(1代表行,2代表列,也可寫作c(1,2))data_sd <- apply(data,2,sd)#生成每一組的標(biāo)準(zhǔn)差。 barcenters <- barplot(data_mean,names.arg = names(data_mean),ylim = c(0,20)) #將barplot()存入一個(gè)對(duì)象中,這個(gè)對(duì)象保存的是條柱的中心位置的橫坐標(biāo) #names.arg參數(shù)為定義標(biāo)簽名稱 segments(barcenters,data_mean-data_sd,barcenters,data_mean+data_sd,lty=1.2) #segments()加線段 arrows(barcenters,data_mean-data_sd,barcenters,data_mean+data_sd,code =3,angle = 45) #arrows()加箭頭 #運(yùn)用segments()和arrows(),兩個(gè)低級(jí)繪圖函數(shù),這兩個(gè)函數(shù)都接受x0,y0,x1,y1四個(gè)數(shù)值,分別表示起始點(diǎn)和終止點(diǎn)坐標(biāo)。 #code可取1、2、3分別代表顯示下箭頭、上箭頭、雙箭頭,angle代表箭頭角度,取90時(shí)代表一條直線#適度美化 A=c(rep("drug A",10),rep("drug B",10)) B=rnorm(20,10,4) C=rnorm(20,8,3) D=rnorm(20,5,4) data = data.frame(A,B,C,D) #生成數(shù)據(jù)框 colnames(data)=c("treatment","dose_1","dose_2","dose_3") #重新命名數(shù)據(jù)集列名 sigbio=aggregate(cbind(dose_1,dose_2,dose_3)~treatment,data=data,mean) #計(jì)算不同療法下,不同劑量效果平均值 #新函數(shù)aggregate(formula, data, FUN, ..., subset, na.action = na.omit), #formula處可以放一個(gè)公式,此處我們使用了cbind(), FUN代表可以在其中套用其他函數(shù) #cbind(a,b,c)中矩陣a,b,c的行數(shù)必需相符,根據(jù)列進(jìn)行合并,即疊加所有列,并有rbind()函數(shù)為疊加所有行 rownames(sigbio)=sigbio[,1] sigbio=as.matrix(sigbio[,-1]) lim=1.2*max(sigbio) error.bar <- function(x,y,upper,lower=upper,length=0.1,...){arrows(x,y+upper,x,y-lower,angle = 90,code = 3,length = length,...) }stdev=aggregate(cbind(dose_1,dose_2,dose_3)~treatment,data = data,sd) rownames(stdev)=stdev[,1] stdev=as.matrix(stdev[,-1])*1.96/10 ze_barplot=barplot(sigbio,beside = T,legend.text = T,col=c('blue','skyblue'),ylim=c(0,lim),ylab = "height") error.bar(ze_barplot,sigbio,stdev)三、利用基礎(chǔ)繪圖包的高級(jí)繪圖函數(shù)——hist()繪制直方圖與金字塔圖
#直方圖獨(dú)有的參數(shù)介紹: #breaks:截?cái)鄥?shù)表示直方圖具體的區(qū)間范圍 #freq:邏輯參數(shù),表示是否顯示頻數(shù),默認(rèn)為T,若設(shè)置為F,則顯示概率密度圖 #include.lowest:邏輯參數(shù),表示是否包括最小值,可配合breaks參數(shù)使用 #right:邏輯參數(shù),表示是否包括最大值,使用方法同include.lowest #density:是否添加圖中斜線(shading lines),注意不是添加密度線 #angle:表示shading lines的斜率,默認(rèn)為45°##繪制直方圖 op <- par(mfrow=c(2,3)) set.seed(100) data <- rnorm(200,10,5) hist(data,col = 'light green') #原始默認(rèn)直方圖hist(data,col = 'skyblue',breaks = 15) #breaks = 15表示將原始數(shù)據(jù)分隔成10組hist(data,col = 'orange',breaks = seq(-5,25,1)) #seq()函數(shù)用于產(chǎn)生一組有規(guī)律的數(shù)值,seq(-5,25,1)表示從-5到25取值,間距為1hist(data,col = 'pink',breaks = seq(-5,25,1),density = TRUE,angle=45) #添加shading lines,并設(shè)置角度為45°hist(data,col = 'yellow',breaks = seq(-5,25,1),freq = F) lines(density(data),col='blue',lty=3,lwd=2) #顯示概率密度圖hist(data,col = 'pink',breaks = seq(-5,25,1),freq = F,axes=F,main='聊生信教學(xué)圖例',xlab = '',ylab='') lines(density(data),col='sienna',lty=1,lwd=1)#可自行運(yùn)用上期介紹各參數(shù)進(jìn)行自定義直方圖樣式 par(op) #釋放以上參數(shù)##直方圖疊加: #install.packages("effects") #前文中的操作我們使用R中自帶的程序包即可完成,在此我們學(xué)習(xí)安裝并使用新包. #新包"effects" library(effects)## Loading required package: carData## lattice theme set by effectsTheme() ## See ?effectsTheme for details.data("TitanicSurvival")#調(diào)用新包中"TitanicSurvival"這一數(shù)據(jù) hist(TitanicSurvival$age,main = '泰坦尼克號(hào)不同年齡游客生存死亡占比直方圖',xlab = '年齡',ylab = '占比',col = 'skyblue',breaks = seq(0,80,1)) #繪制年齡分布圖,從0~80歲,每?jī)蓺q畫一個(gè)條柱 hist(TitanicSurvival$age[which(TitanicSurvival$survived=='no')],col = 'indianred',add=T,breaks = seq(0,80,1)) #add參數(shù)為T時(shí),表示在當(dāng)前年齡分布圖上添加另一個(gè)直方圖,此處我們添加的為survived=='no',即不同年齡死亡比例. legend(60, 40, c("存活", "死亡"),fill = c("skyblue", "indianred"))##背靠背直方圖 df=data.frame(x=rnorm(100,mean=2),x2=rnorm(100,mean=5)) h1=hist(df$x,plot = F) h2=hist(df$x2,plot = F) #繪制兩個(gè)直方圖,數(shù)據(jù)存在h1h2兩個(gè)對(duì)象中 h2$counts= - h2$counts #將h2的值反過來 hmax= max(h1$counts) hmin= min(h2$counts) #設(shè)置y軸取值范圍 X = c(h1$breaks,h2$breaks) xmax = max(X) xmin = min(X) #設(shè)置x軸取值范圍 plot(h1,ylim = c(hmin,hmax),col="lemonchiffon",xlim = c(xmin,xmax),main = '背靠背直方圖') lines(h2,col='lightpink')##金字塔圖--PlotPyramid() #install.packages('DescTools')#下載新包 library(DescTools)#lx:接受一個(gè)數(shù)值向量或一個(gè)矩陣.當(dāng)lx為一個(gè)向量時(shí),則該向量用來繪制左半邊的條形圖或直方圖;當(dāng)為一個(gè)矩陣時(shí),該矩陣的第一列數(shù)據(jù)用來繪制左半邊的圖,第二列繪制右半邊的圖,自動(dòng)忽略其他列. #rx:若lx為矩陣時(shí),該參數(shù)無作用.若lx為一個(gè)數(shù)值向量時(shí),則rx接受一個(gè)相同長(zhǎng)度的數(shù)值向量,用來繪制右半邊的圖. #ylab:設(shè)置y軸標(biāo)簽,接受一個(gè)字符串向量. #ylab.x:y軸標(biāo)簽的位置參數(shù),默認(rèn)為0,即標(biāo)簽位于x=0的位置,也就是圖的正中間. #border:設(shè)置圖形的邊框,當(dāng)不需要邊框是,設(shè)置border=NA. #lxlab,rxlab:設(shè)置左右兩張圖的x軸標(biāo)簽. #gapwidth:設(shè)置左右兩張圖之間的間距,設(shè)置為0時(shí),則無間隙. #xaxt:設(shè)置是否繪制x軸,設(shè)置為n時(shí),則不繪制x軸. #args.grid:繪制背景網(wǎng)格,設(shè)置為NA則無背景網(wǎng)格.par(mfrow=c(1,3)) m.pop <- c(3.2,3.5,3.6,3.6,3.5,3.5,3.7,3.9,3.7,3.5,3.2,2.8,2.2,1.8,1.5,1.3,0.7,0.4,0.2) f.pop <- c(3.2,3.4,3.5,3.5,3.5,3.7,4.0,3.8,3.9,3.6,3.2,2.5,2.0,1.7,1.5,1.3,1.0,0.8,0.4) age <- c("0-4","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-44","45-49","50-54","55-59","60-64","65-69","70-74","75-79","80-84","85-89","90+") #準(zhǔn)備數(shù)據(jù) PlotPyramid(m.pop,f.pop,ylab=age,space=0,col=c("lightsteelblue","pink"),main="Age Distribution at Baseline",lxlab="male",rxlab="female") #繪制左側(cè)第一張圖 PlotPyramid(m.pop,f.pop,ylab=age,space=0,col=c("lightsteelblue","pink"),xlim=c(-5,5),main="Age Distribution at Baseline",lxlab="male",rxlab="female",gapwidth=0,ylab.x=-5) #繪制中間第二張圖 PlotPyramid(c(1,3,5,2,0.5),c(2,4,6,1,0),ylab= LETTERS[1:5],space=0.3,col=rep(rainbow(5,s=0.5),each=2),xlim=c(-10,10),args.grid=NA,cex.names=1.5,adj=1,lxlab="Group A",rxlab="Group B",gapwidth=0,ylab.x=-8,xaxt="n")#繪制右側(cè)第三張圖## 鏡面圖 x1= rnorm(100,mean = 2) x2= rnorm(100,mean = 5) par(mfrow=c(2,1)) par(mar=c(0,5,3,3)) plot(density(x1),main = "",xlab = "",ylim=c(0,1),xaxt="n",las=1,col="slateblue",lwd=4) par(mar=c(5,5,0,3)) plot(density(x2),main = "",xlab="Value of my variable",ylim=c(1,0),las=1,col="tomato",lwd=4)四、利用基礎(chǔ)繪圖包的高級(jí)繪圖函數(shù)——pie()繪制餅圖
#常用參數(shù)介紹 # x:非負(fù)數(shù)值向量,用于繪制占比情形 # edges:餅圖邊緣圓滑程度,取值越大越圓滑,默認(rèn)值為200 # radius:餅圖半徑,默認(rèn)為0.8 # clockwise:邏輯參數(shù),用于確定是否采用順時(shí)針方向繪制對(duì)應(yīng)扇形,默認(rèn)為F # density:表示陰影線密度,默認(rèn)值為NULL,表示沒有陰影線 # border:表示劃分餅的切割線的顏色 pie(rep(1,26),col = rainbow(26,s=0.7),labels = LETTERS[1:26],radius = 1,clockwise=T)library(RColorBrewer) pie.mydata <- c(10.8,27.0,6.2,21.1,12.8,22.1) diseasetypes <- c("流感","中風(fēng)","外傷","昏厥","中毒","其他") names(pie.mydata) <- paste(diseasetypes,pie.mydata,"%",sep=" ") pie(pie.mydata,col = brewer.pal(length(pie.mydata),"Reds"),border=0,radius = 0.9,init.angle = 90) # init.angle為設(shè)置初始角度大小,順時(shí)針是為90度,否則為0 # 總體來說基礎(chǔ)繪圖包中pie()函數(shù)能力有限,如果需要更多靈活展示,還要學(xué)習(xí)ggplot2五、利用基礎(chǔ)繪圖包的高級(jí)繪圖函數(shù)——繪制克利夫蘭點(diǎn)圖
#部分參數(shù)介紹: # x:接受一個(gè)向量或矩陣 # groups:x的分組情況,若x為矩陣,則默認(rèn)groups為該矩陣的列 # gdata:每組的值,通常為一個(gè)匯總值,比如均值或中位數(shù) # cex, pt.cex:都是用來設(shè)置大小,前者用于字符設(shè)置,后者用于圖中元素設(shè)置 # color,gcolor,lcolor: 顏色參數(shù),第一個(gè)用于設(shè)置圖中點(diǎn)和標(biāo)簽;第二個(gè)用于設(shè)置組的標(biāo)簽和值的顏色;第三個(gè)用于設(shè)置圖中水平線的顏色op <- par(xaxs = "i") # xaxs參數(shù):設(shè)置坐標(biāo)軸x的間隔方式。取值范圍為:"r","i","e", "s","d"。 #一般來說,計(jì)算方式是由xlim的數(shù)值范圍確定的(如果xlim指定了的話)。"r"(regular)首先會(huì)對(duì)數(shù)值范圍向兩端各延伸4%,然后在延伸后的數(shù)值區(qū)間中設(shè)置坐標(biāo)值;"i"(internal)直接在原始的數(shù)據(jù)范圍中設(shè)置坐標(biāo)值;**"s"(standard)和"e"(extended)、;"d"(direct)目前還不支持。** dotchart(t(VADeaths),xlim = c(0,100),main = "Death Rates in Virginia-1940",lcolor = 'skyblue',color = 'lightsalmon',gcolor = 'mediumorchid',pch = 16) # 使用內(nèi)置數(shù)據(jù)集VADeaths par(op)六、利用基礎(chǔ)繪圖包的高級(jí)繪圖函數(shù)——coplot()繪制條件圖
#部分參數(shù)介紹: # formula:傳入一個(gè)公式.此處的公式與R基礎(chǔ)包中的其他函數(shù)所要求的公式格式相同.一般形式為y~x,左邊是因變量,右邊是自變量.那么條件繪圖的條件體現(xiàn)在哪呢?把這個(gè)公式稍微改造一下,y~x|a,注意,添加一個(gè)管道符.這個(gè)公式的意思就是在變量"a"存在的情況下,y隨x的變化而變化,這就是條件的意思. # data:傳入一個(gè)數(shù)據(jù)框,必須包含你所寫公式中x,y等變量 # given.values:給定一個(gè)值,可根據(jù)例子進(jìn)行理解 # panel:設(shè)置面板默認(rèn)為points,也可改為hist,barplot等 # rows,columns:行列參數(shù),接受一個(gè)數(shù)值分割畫布.given.depth <- co.intervals(quakes$depth,number = 4,overlap = 0) #此處調(diào)用co.intervals函數(shù),將震源深度分為4組,且不重疊,overlap可設(shè)置為0~1,表示各組疊加程度. coplot(lat~long|depth,data = quakes,given.values = given.depth,rows = 1,panel = function(x,y,...)panel.smooth(x,y,span = 0.7)) #此處我們定義了panel函數(shù),如果用hist寫法應(yīng)該是panel=function(x,y,...)hist(x,...) #三個(gè)點(diǎn)"..."表示缺省參數(shù),因?yàn)閔ist()中有很多參數(shù),不可能一一列出,所以采用 "..."表示.????以上我們就已經(jīng)學(xué)習(xí)了主要的R自帶的高級(jí)繪圖函數(shù),但若需要對(duì)高級(jí)繪圖函數(shù)所繪制的圖形進(jìn)行美化,則還需要使用低級(jí)繪圖函數(shù)進(jìn)行修飾。將低級(jí)繪圖函數(shù)與高級(jí)繪圖函數(shù)結(jié)合起來使用,畫出來的圖才會(huì)更加專業(yè)美觀。如前所述,在使用高級(jí)繪圖函數(shù)進(jìn)行圖形繪制以后,這些低級(jí)繪圖函數(shù)才會(huì)起作用,而其所起作用的范圍也僅限于當(dāng)前繪制出的這一幅圖形。
????這里簡(jiǎn)單介紹幾個(gè)低級(jí)繪圖函數(shù)的使用方法:
# 1. 圖例的添加--legend() a=c(1:5);b=c(2,3,3,4,5);cc=c(4,5,2,3,1)#自定義生成三個(gè)變量 plot(b~a,type="b",bty="l",xlab="value of a",ylab = "value of b",col='red',lwd=3,pch=17,ylim=c(1,5)) #繪制關(guān)于a和b的線圖 lines(cc~a,col='blue',lwd=3,pch=19,type="b") #此處用lines()函數(shù)添加第二條函數(shù)線 legend("bottomleft",legend = c("Group 1","Group 2"),col = c('red','blue'),pch = c(17,19),bty = "n",pt.cex = 2,cex = 1.2,text.col = "black",horiz = F,inset = c(0.1,0.1))#bottomleft:為位置參數(shù),接受一個(gè)字符串,比如'topright',表示右上方,也接受一個(gè)坐標(biāo),比如(3,5) #legend = c("Group 1","Group 2"):在圖例中添加內(nèi)容,相當(dāng)于設(shè)置圖例中各組標(biāo)簽. #pt.cex:定義圖例中標(biāo)簽文字的大小data <- sample(20:80,20) par(mar =c(4,3,3,1)) barcenter <- barplot(data,col = 'skyblue',axes = F,ylim =c(-5,100)) axis(2,at=seq(0,100,10)) # 在圖中添加文本: text(barcenter,-2,labels = LETTERS[1:20],col = 'red',cex = 0.8)mycars <- data.frame(car = c('Honda','Benz','BMW','Audi','Chery','Toyota','Ford','MG'),mtg = c(4.0,5.2,5.5,2.8,1.8,2.8,3.0,4.8)) #建造一個(gè)數(shù)據(jù)集 plot(mycars$mtg,cex=mycars$mtg,col='hotpink',pch=21,bg='skyblue',ylab = 'cars\' mtg',xlab = 'cars',xlim = c(0,9)) #此處,cex參數(shù)被設(shè)置成車輛mtg的大小,由于mtg變量取值大小不一,因此也就生成了一個(gè)氣泡圖. # 在圖中添加文本: text(1:8,mycars$mtg,labels = mycars$car) # 在圖中添加每輛車的名字。注意text()函數(shù)中的向量操作。 # 橫坐標(biāo)是1~7,縱坐標(biāo)是每輛汽車mtg的取值。? ? 以上內(nèi)容的代碼主要來自《R語言與醫(yī)學(xué)統(tǒng)計(jì)圖形》,感謝他們的工作。我們加入了一些自己的理解和總結(jié),并進(jìn)行了電子化(便于讀者直接從本文復(fù)制代碼),以饗讀者。
往期精品(點(diǎn)擊圖片直達(dá)文字對(duì)應(yīng)教程)
機(jī)器學(xué)習(xí)
后臺(tái)回復(fù)“生信寶典福利第一波”或點(diǎn)擊閱讀原文獲取教程合集
總結(jié)
以上是生活随笔為你收集整理的一览R基础包的六个高级绘图函数(盒型boxplot|条形barplot|直方hist|饼pie|dotchart|coplot)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ETE - 在线可视化进化树和多序列比对
- 下一篇: 重磅!这个生信神器助你文章秒出图——mi