一览R基础包的六个高级绘图函数(盒型boxplot|条形barplot|直方hist|饼pie|dotchart|coplot)...
????除了數理統計,今天我們繼續聊一下R語言的另一個任務:繪圖。
????注意:我們公眾號的每一次發文盡量列出一個小系列。如果九陽神功有10層,能以一篇文章寫10層,絕不一篇寫一層、分散寫10篇,追求字典、工具的性質。
????經常畫圖的熟練操作工應該背誦出每一個細節,故適合反復、強化練習少量的幾篇。但每一篇的篇幅難免有所限制。
????此文的代碼讀者可直接復制、粘貼、套用,是此文的一點價值。其實關于繪圖聊生信公眾號前幾篇有個更基礎的文章:《R語言簡介、安裝、R包的安裝問題、R的繪圖函數概覽、par()函數及plot()函數詳解》(在這篇的內容有所理解之前請不要看今天這篇。九陽神功跳過1-3層直接練習第九層?有點虎了)。
? ? 目前網絡、自媒體上已經有大量的R繪圖教程,那么先問一個小問題:R的繪圖函數到底有幾層,有多少種?好吧,我們直接復習:
基礎繪圖包包括 :高級繪圖函數和低級繪圖函數。plot()函數是不是特別簡單?其實它是基礎繪圖包中的高級繪圖函數。基礎繪圖包在R語言被安裝后即存在,可直接使用,永不升級。基礎繪圖包不算Low,很多CNS文章仍在使用。”鉆石恒久遠、經典永留存“,所謂顏值不在于繪圖包是否高級,主要在于線條的粗細、精心的排版、文字與圖形之間的比例、以及有點兒"品位"的顏色搭配。
基礎繪圖包中的高級繪圖函數,包括:plot()泛型函數(generic method)、boxplot()盒型圖、barplot()條形圖、hist()直方圖或金字塔圖、pie()餅圖、dotchart()克利夫蘭點圖和coplot()條件圖等(后兩個有些冷門)。這里有一個實踐過程中容易混淆的地方:大部分par()函數的參數(即:函數中的參數,不是低級繪圖函數)不僅可以自己使用,也可以直接在上述其它高級繪圖函數中使用,效果等同于在par()中使用(par是什么?看我們之前的一篇的文章:點我)。一些參數只能在par()中使用,高級繪圖函數無法實現其功能,如: ask; fig; fin; lheight; mai; mar; mfcol; mfrow; mfg; new; oma; omd; omi; pin; plt; ps; pty; usr; xlog; ylog等(注意:這些是函數內部的參數,不是函數)。
基礎繪圖包中的低級繪圖函數,無法(憑空)繪圖,即只有在高級繪圖函數繪制出來的圖形中有效,如:text()加文本, legned()加圖例, axis()繪制坐標軸, points()加散點, titles()加標題, arrows()加箭頭, box()繪制圖形邊框, abline()加直線, clip()修剪圖形, locator()識別圖中的點的坐標, layout()切分畫布, lines()加線條, segments()加線段, rug()加小地毯, polygon()構建多邊形, mtext()在圖形四周添加文字, grid()添加背景網格線。
高級繪圖包(注意與基礎繪圖包的高級繪圖函數是兩碼事兒),包括ggplot2包、maps包、曼哈頓圖等。這些包需要額外安裝、加載,且必須與R的版本相匹配,也可能互相依賴,故經常出現版本不可用的問題。最新版的R可能已經自帶一些高級繪圖包,但不全。你也可以開發一個新的、風靡學界的高級繪圖包,并留上你的名字等印記,順帶著發個SCI,不用買試劑、做實驗,一樣可以被高引用、對科學有所貢獻。高級繪圖包單獨作為一個系列放在聊生信公眾號后續的文章中。
????需要特別指出的是,基礎繪圖包中的高級繪圖函數plot() 是泛型函數,可以理解成一個函數族。當我們調用這個函數時,plot()會自動識別傳入的數據或參數所屬的類,然后調用對應的子函數來作圖。那么plot()有哪些子函數?如下:
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一、利用基礎繪圖包的高級繪圖函數——boxplot()繪制盒型圖(或叫箱線圖)
????生成一個隨機數:
rnorm(40) # rnorm()函數用于生成一個數值向量,其中的數值符合正態分布(隨機生成);默認mean = 0, sd = 1,即平均值為0,標準差為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? ? 附加一些關于數據的統計知識:
????一個由多個數值組成的數值向量,一般具有:平均值、最大值、最小值、中值(又稱中位數,是指將統計總體當中的各個變量值按大小順序排列起來,形成一個數列,處于變量數列中間位置的變量值就稱為中位數)、方差等。這些統計值用來反映數據的總體特征。
????四分位數是通過3個點將全部數據等分為4部分,其中每部分包含25%的數據。很顯然,中間的四分位數就是中位數,因此通常所說的四分位數是指處在25%位置上的數值(稱為下四分位數)和處在75%位置上的數值(稱為上四分位數)。
????所謂統計學中的箱線圖(box plot)就是對四分位數的繪圖。
????所謂正態分布(Normal distribution),也稱“常態分布”,又名高斯分布(Gaussian distribution)。若隨機變量X服從一個數學期望為μ、方差為σ2的正態分布,則記為N(μ,σ2)。正態分布的期望值μ決定了其概率密度圖的位置,標準差σ決定了分布的幅度。當μ = 0, σ = 1時的正態分布是標準正態分布N(0,1)。
boxplot(rnorm(40)) # 繪制一組符合正態分布的隨機數據的盒型圖,rnorm()函數用于產生服從標準正態分布N(0,1)的隨機數,我們此時產生了40個。跟上圖完全一樣的代碼再畫一次圖,然后比較這兩個圖的區別:
boxplot(rnorm(40))
????上述代碼如果多運行幾次,會發現:同樣的代碼,每次獲得的圖形略有不同。比如:坐標軸刻度;箱線圖的最上面和最下面(胡須):有時候有小原點(異常值),有時候沒有。每次獲得的圖形不同,是因為每次獲得了不同的隨機數。若想保證多次取到同一組隨機數(利于代碼、繪圖的可重復性),則需要設置隨機數種子set.seed(100)。
????另外,若想控制箱線圖的最上面和最下面(胡須)附近的小原點(異常值),可設置boxplot的range參數:
par(mfrow=c(1,4)) set.seed(100) # 設置隨機數種子,以保證多次取到同一組隨機數,利于代碼的可重復性。 data=rnorm(100) # 產生100個服從標準正態分布的隨機數 boxplot(data, range=0, xlab='range is 0', col='skyblue') # range為范圍函數,表示覆蓋本體極端值間距的倍數(即:決定箱線圖最上沿及最下沿對箱體的覆蓋區域)。 # 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')##相關參數介紹: # width設置box相對寬度;boxwex設置box寬度,取值越大盒子越寬 # outline邏輯參數,是否繪制離群點,默認為T,即繪制離群點 # notch邏輯參數,是否使用卡槽,默認為F # names設置盒型圖中各個box的標簽(并不是這整個盒型圖的標簽) # horizontal邏輯參數,是否橫向放置盒型圖,默認為F,即縱向放置 # add邏輯參數,是否將盒型圖添加到現有圖形上 # at配合add使用,該盒型圖的橫坐標位置的定義 # 建議每次看繚亂的代碼之前,先細看后面畫出的圖,更容易看懂代碼 boxplot(len~dose,#繪制變量len與dose的盒型圖(前者為連續型變量,后者是分類變量)data=ToothGrowth,#使用R語言內置數據集ToothGrowthboxwex=0.3,at=1:3-0.2,#at參數定義了圖中盒子橫坐標位置為0.8,1.8,2.8subset=supp=="VC",#采集ToothGrowth中supp為VC的數據,即此處只繪制VC數據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()為低級繪圖函數: 加圖例 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) #這是十分關鍵的一步!——將data中的names數據由向量屬性(vector)改為因子屬性(factor) #由于data中默認所有數據均為向量屬性,而boxplot函數只可以識別factor,若不手動更改其屬性,則以下代碼將無法正常運行。 #tips:R擁有許多用于存儲數據的對象類型,包括標量、向量、矩陣、數組、數據框、列表及因子。boxplot(data$value~data$names,col=ifelse(levels(data$names)=="Nairobi","lightblue",ifelse(levels(data$names)=="Eskimo","mediumpurple3","grey75")),ylab="disease",xlab="- variety -")#這里出現了一個新函數!記得拿出小本本積累下來~~ifelse()使用方法為:ifelse(test, yes, no)。若輸入"test"成立,則輸出"yes",不成立則輸出"no" #在這里表示,若names=Nairobi,則將其顯示為"lightblue",若names≠Nairobi,則進行第二次ifelse函數判斷。(即若names=Eskimo,則將其輸出為"mediumpurple3",若names≠Eskimo,則輸出為"grey75")#盒型圖默認按照所給數據名稱首字母進行排序,如何根據其他指標對盒型進行排序,讓圖形更美觀呢? #這里以各box中數據中位數排序舉例: data$names = as.factor(data$names) data$value = as.numeric(data$value) order_names <- with(data,reorder(names,value,median,na.rm=TRUE)) #對names進行重新排序,標準為median(value),即value中位數。 boxplot(data$value~order_names,col='salmon',ylab="disease",xlab="- variety -")#新函數reorder()使用方法:reorder(x,y,z),x為需要重排的因子變量,y為排序標準,z為函數名稱二、利用基礎繪圖包的高級繪圖函數——barplot()繪制條形圖(或叫直方圖)
##相關參數介紹: # height:用于設置條形高度 # width:用于設置條柱寬度,默認為1 # space:用于設置條柱間隔 # names.arg:用于設置條形圖標簽,即自定義各條帶名稱 # horiz:邏輯參數,是否使用水平條柱 # plot:邏輯參數,是否畫圖 # add:邏輯參數,是否將條形圖添加到現有的圖形上data <- sample(c(10:100),10)#生成10個10-100之間的隨機整數 barplot(data,col=rainbow(10,s=0.5))#將這10個隨機數傳入barplot()函數,使用rainbow()內置函數生成彩虹色,并將飽和度s調至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))) #生成一個3行3列的矩陣,行名(dimnames)為、B、C,列名(paste)為1、2、3barplot(my_matrix,beside = T,col=c('rosybrown',' wheat','seashell'),main = '原始條形圖') #beside參數表示是否將條柱平行放置,若為F則堆棧放置 barplot(t(my_matrix),beside = T,col=c('rosybrown',' wheat','seashell'),main = '行列互換后條形圖') #t()函數為專置函數,即將矩陣行列進行互換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') #構造一個數據,用于表示四個國家人均GDP。barplot(average_gdp,names.arg = country,col=heat.colors(4)) #為每一個條柱添加標簽#heat.colors()函數為生成一個從紅色漸變到黃色再到白色的暖色系。 barplot(average_gdp,names.arg = country,horiz = TRUE,col=heat.colors(4)) #horiz = TRUE設置水平放置條圖 barplot(average_gdp,names.arg = country,horiz = FALSE,width = c(0.4,0.6,0.8,1.0),col=heat.colors(4)) #width設置條柱寬度 barplot(average_gdp,names.arg = country,horiz = FALSE,space = 0,col=heat.colors(4))#space設置條柱間隔添加誤差條
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)) #構建一個隨機數據集,該數據集包含三個變量,分別表示三種不同的藥物劑量下,小鼠的某種生理指標的變化水平,每一組均含有100個研究對象。 #rnorm(100,10,2)為隨機取100個值,平均值為10,方差為2 #r這列代表隨機,可以替換成dnorm, pnorm, qnorm 作不同計算 #r = random = 隨機, d= density = 密度, p= probability = 概率 , q =quantile = 分位data_mean <- apply(data,2,mean)#生成每一組的平均數 #新函數apply()表示將data數據中第2列取平均值。(1代表行,2代表列,也可寫作c(1,2))data_sd <- apply(data,2,sd)#生成每一組的標準差。 barcenters <- barplot(data_mean,names.arg = names(data_mean),ylim = c(0,20)) #將barplot()存入一個對象中,這個對象保存的是條柱的中心位置的橫坐標 #names.arg參數為定義標簽名稱 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()加箭頭 #運用segments()和arrows(),兩個低級繪圖函數,這兩個函數都接受x0,y0,x1,y1四個數值,分別表示起始點和終止點坐標。 #code可取1、2、3分別代表顯示下箭頭、上箭頭、雙箭頭,angle代表箭頭角度,取90時代表一條直線#適度美化 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) #生成數據框 colnames(data)=c("treatment","dose_1","dose_2","dose_3") #重新命名數據集列名 sigbio=aggregate(cbind(dose_1,dose_2,dose_3)~treatment,data=data,mean) #計算不同療法下,不同劑量效果平均值 #新函數aggregate(formula, data, FUN, ..., subset, na.action = na.omit), #formula處可以放一個公式,此處我們使用了cbind(), FUN代表可以在其中套用其他函數 #cbind(a,b,c)中矩陣a,b,c的行數必需相符,根據列進行合并,即疊加所有列,并有rbind()函數為疊加所有行 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)三、利用基礎繪圖包的高級繪圖函數——hist()繪制直方圖與金字塔圖
#直方圖獨有的參數介紹: #breaks:截斷參數表示直方圖具體的區間范圍 #freq:邏輯參數,表示是否顯示頻數,默認為T,若設置為F,則顯示概率密度圖 #include.lowest:邏輯參數,表示是否包括最小值,可配合breaks參數使用 #right:邏輯參數,表示是否包括最大值,使用方法同include.lowest #density:是否添加圖中斜線(shading lines),注意不是添加密度線 #angle:表示shading lines的斜率,默認為45°##繪制直方圖 op <- par(mfrow=c(2,3)) set.seed(100) data <- rnorm(200,10,5) hist(data,col = 'light green') #原始默認直方圖hist(data,col = 'skyblue',breaks = 15) #breaks = 15表示將原始數據分隔成10組hist(data,col = 'orange',breaks = seq(-5,25,1)) #seq()函數用于產生一組有規律的數值,seq(-5,25,1)表示從-5到25取值,間距為1hist(data,col = 'pink',breaks = seq(-5,25,1),density = TRUE,angle=45) #添加shading lines,并設置角度為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='聊生信教學圖例',xlab = '',ylab='') lines(density(data),col='sienna',lty=1,lwd=1)#可自行運用上期介紹各參數進行自定義直方圖樣式 par(op) #釋放以上參數##直方圖疊加: #install.packages("effects") #前文中的操作我們使用R中自帶的程序包即可完成,在此我們學習安裝并使用新包. #新包"effects" library(effects)## Loading required package: carData## lattice theme set by effectsTheme() ## See ?effectsTheme for details.data("TitanicSurvival")#調用新包中"TitanicSurvival"這一數據 hist(TitanicSurvival$age,main = '泰坦尼克號不同年齡游客生存死亡占比直方圖',xlab = '年齡',ylab = '占比',col = 'skyblue',breaks = seq(0,80,1)) #繪制年齡分布圖,從0~80歲,每兩歲畫一個條柱 hist(TitanicSurvival$age[which(TitanicSurvival$survived=='no')],col = 'indianred',add=T,breaks = seq(0,80,1)) #add參數為T時,表示在當前年齡分布圖上添加另一個直方圖,此處我們添加的為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) #繪制兩個直方圖,數據存在h1h2兩個對象中 h2$counts= - h2$counts #將h2的值反過來 hmax= max(h1$counts) hmin= min(h2$counts) #設置y軸取值范圍 X = c(h1$breaks,h2$breaks) xmax = max(X) xmin = min(X) #設置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:接受一個數值向量或一個矩陣.當lx為一個向量時,則該向量用來繪制左半邊的條形圖或直方圖;當為一個矩陣時,該矩陣的第一列數據用來繪制左半邊的圖,第二列繪制右半邊的圖,自動忽略其他列. #rx:若lx為矩陣時,該參數無作用.若lx為一個數值向量時,則rx接受一個相同長度的數值向量,用來繪制右半邊的圖. #ylab:設置y軸標簽,接受一個字符串向量. #ylab.x:y軸標簽的位置參數,默認為0,即標簽位于x=0的位置,也就是圖的正中間. #border:設置圖形的邊框,當不需要邊框是,設置border=NA. #lxlab,rxlab:設置左右兩張圖的x軸標簽. #gapwidth:設置左右兩張圖之間的間距,設置為0時,則無間隙. #xaxt:設置是否繪制x軸,設置為n時,則不繪制x軸. #args.grid:繪制背景網格,設置為NA則無背景網格.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+") #準備數據 PlotPyramid(m.pop,f.pop,ylab=age,space=0,col=c("lightsteelblue","pink"),main="Age Distribution at Baseline",lxlab="male",rxlab="female") #繪制左側第一張圖 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")#繪制右側第三張圖## 鏡面圖 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)四、利用基礎繪圖包的高級繪圖函數——pie()繪制餅圖
#常用參數介紹 # x:非負數值向量,用于繪制占比情形 # edges:餅圖邊緣圓滑程度,取值越大越圓滑,默認值為200 # radius:餅圖半徑,默認為0.8 # clockwise:邏輯參數,用于確定是否采用順時針方向繪制對應扇形,默認為F # density:表示陰影線密度,默認值為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("流感","中風","外傷","昏厥","中毒","其他") 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為設置初始角度大小,順時針是為90度,否則為0 # 總體來說基礎繪圖包中pie()函數能力有限,如果需要更多靈活展示,還要學習ggplot2五、利用基礎繪圖包的高級繪圖函數——繪制克利夫蘭點圖
#部分參數介紹: # x:接受一個向量或矩陣 # groups:x的分組情況,若x為矩陣,則默認groups為該矩陣的列 # gdata:每組的值,通常為一個匯總值,比如均值或中位數 # cex, pt.cex:都是用來設置大小,前者用于字符設置,后者用于圖中元素設置 # color,gcolor,lcolor: 顏色參數,第一個用于設置圖中點和標簽;第二個用于設置組的標簽和值的顏色;第三個用于設置圖中水平線的顏色op <- par(xaxs = "i") # xaxs參數:設置坐標軸x的間隔方式。取值范圍為:"r","i","e", "s","d"。 #一般來說,計算方式是由xlim的數值范圍確定的(如果xlim指定了的話)。"r"(regular)首先會對數值范圍向兩端各延伸4%,然后在延伸后的數值區間中設置坐標值;"i"(internal)直接在原始的數據范圍中設置坐標值;**"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) # 使用內置數據集VADeaths par(op)六、利用基礎繪圖包的高級繪圖函數——coplot()繪制條件圖
#部分參數介紹: # formula:傳入一個公式.此處的公式與R基礎包中的其他函數所要求的公式格式相同.一般形式為y~x,左邊是因變量,右邊是自變量.那么條件繪圖的條件體現在哪呢?把這個公式稍微改造一下,y~x|a,注意,添加一個管道符.這個公式的意思就是在變量"a"存在的情況下,y隨x的變化而變化,這就是條件的意思. # data:傳入一個數據框,必須包含你所寫公式中x,y等變量 # given.values:給定一個值,可根據例子進行理解 # panel:設置面板默認為points,也可改為hist,barplot等 # rows,columns:行列參數,接受一個數值分割畫布.given.depth <- co.intervals(quakes$depth,number = 4,overlap = 0) #此處調用co.intervals函數,將震源深度分為4組,且不重疊,overlap可設置為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函數,如果用hist寫法應該是panel=function(x,y,...)hist(x,...) #三個點"..."表示缺省參數,因為hist()中有很多參數,不可能一一列出,所以采用 "..."表示.????以上我們就已經學習了主要的R自帶的高級繪圖函數,但若需要對高級繪圖函數所繪制的圖形進行美化,則還需要使用低級繪圖函數進行修飾。將低級繪圖函數與高級繪圖函數結合起來使用,畫出來的圖才會更加專業美觀。如前所述,在使用高級繪圖函數進行圖形繪制以后,這些低級繪圖函數才會起作用,而其所起作用的范圍也僅限于當前繪制出的這一幅圖形。
????這里簡單介紹幾個低級繪圖函數的使用方法:
# 1. 圖例的添加--legend() a=c(1:5);b=c(2,3,3,4,5);cc=c(4,5,2,3,1)#自定義生成三個變量 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)) #繪制關于a和b的線圖 lines(cc~a,col='blue',lwd=3,pch=19,type="b") #此處用lines()函數添加第二條函數線 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:為位置參數,接受一個字符串,比如'topright',表示右上方,也接受一個坐標,比如(3,5) #legend = c("Group 1","Group 2"):在圖例中添加內容,相當于設置圖例中各組標簽. #pt.cex:定義圖例中標簽文字的大小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)) #建造一個數據集 plot(mycars$mtg,cex=mycars$mtg,col='hotpink',pch=21,bg='skyblue',ylab = 'cars\' mtg',xlab = 'cars',xlim = c(0,9)) #此處,cex參數被設置成車輛mtg的大小,由于mtg變量取值大小不一,因此也就生成了一個氣泡圖. # 在圖中添加文本: text(1:8,mycars$mtg,labels = mycars$car) # 在圖中添加每輛車的名字。注意text()函數中的向量操作。 # 橫坐標是1~7,縱坐標是每輛汽車mtg的取值。? ? 以上內容的代碼主要來自《R語言與醫學統計圖形》,感謝他們的工作。我們加入了一些自己的理解和總結,并進行了電子化(便于讀者直接從本文復制代碼),以饗讀者。
往期精品(點擊圖片直達文字對應教程)
機器學習
后臺回復“生信寶典福利第一波”或點擊閱讀原文獲取教程合集
總結
以上是生活随笔為你收集整理的一览R基础包的六个高级绘图函数(盒型boxplot|条形barplot|直方hist|饼pie|dotchart|coplot)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ETE - 在线可视化进化树和多序列比对
- 下一篇: 重磅!这个生信神器助你文章秒出图——mi