【R作圖】lattice包,畫多個分布柱形圖,hist圖縱軸轉換為百分比


一開始用lattice包,感覺在多元數據的可視化方面,確實做得非常好。各種函數,可以實現任何想要實現的展示。

barchart(y ~ x) y對x的直方圖
bwplot(y ~ x) 盒形圖
densityplot(~ x) 密度函數圖
dotplot(y ~ x) Cleveland點圖(逐行逐列累加圖)
histogram(~ x) x的頻率直方圖
qqmath(~ x) x的關於某理論分布的分位數-分位數圖
stripplot(y ~ x) 一維圖,x必須是數值型,y可以是因子
qq(y ~ x) 比較兩個分布的分位數,x必須是數值型,y可以是數值型,字符型,或者因子,但是必須有兩個"水平"
xyplot(y ~ x) 二元圖(有許多功能)
levelplot(z ~ x*y)
contourplot(z ~ x*y)
在x,y坐標點的z值的彩色等值線圖(x,y和z等長)
cloud(z ~ x*y) 3-D透視圖(點)
wireframe(z ~ x*y) 同上(面)
splom(~ x) 二維圖矩陣
parallel(~ x) 平行坐標圖

下面詳細介紹下xyplot,xyplot相當於plot,不過可以畫多個子圖。

一.不過如果想要在每個子圖里展示幾種點或線,就要想想辦法了。

1)這是一個利用公式關系的方法:Sepal.Length + Sepal.Width ~ Petal.Length + Petal.Width能在一個子圖中畫出

Sepal.Length ~ Petal.Length,Sepal.Width ~ Petal.Length,Sepal.Length ~ Petal.Width,Sepal.Width ~ Petal.Width四種關系

*代碼:

library(lattice)

require(stats)

xyplot(Sepal.Length + Sepal.Width ~ Petal.Length + Petal.Width | Species,
data = iris, scales = "free", layout = c(2, 2),
auto.key = list(x = .6, y = .7, corner = c(0, 0)))

2)下面是另一種方法,利用groups參數:

*代碼:

xyplot(freq~abun |KO ,groups=country,data =zz, type="o", layout = c(4, 6),xlab="Abundance (log10)",ylab="Frequency",scales="free")

 

不過我想要畫hist分布圖,所以嘗試了幾種不同方法:

1)barchart:可惜柱子的透明度無法調節

*代碼:

barchart(freq~abun |KO ,groups=country,data =zz,stack =T,strip=T, layout = c(2, 2),xlab="Abundance (log10)",ylab="Frequency",scales="free",col=rainbow(2,alpha=0.5),box.ratio =100,horizontal=F)

2)想用xyplot 函數,把type改成“h”柱形,但是 lwd 這個參數沒法每個子圖不一樣,lend參數無效 。

*代碼:

xyplot(freq~abun |KO ,groups=country,data =zz, type="h", lwd = 10, lend =2, layout = c(4, 6),xlab="Abundance (log10)",ylab="Frequency",scales="free",col=rainbow(2,alpha=0.5))

3)經過一番研究,用histogram函以及函數中的panel(子圖中加函數)可以實現,但是發覺xlim無法各個子圖自己調整,最后無奈選擇最原始的方法。

*代碼:

histogram(~abun |KO ,data=zz , layout = c(4, 6),xlab="Abundance (log10)",ylab="Frequency",scales="free",col=rainbow(2,alpha=0.5)[1],
panel = function(x, ...) {
panel.histogram(x[1:100],breaks=NULL,type="count",col = rainbow(2,alpha=0.5)[1])
panel.histogram(x[101:160],breaks=NULL,type="count",col = rainbow(2,alpha=0.5)[2])
}
)

4)最原始的方法:

*代碼:

par(mfrow=c(6,4),mar=c(2.1,2.1,0.1,0.1))
for (i in 1:length(id))
{
tmp=log10(as.numeric(data[id[i],2:161]))
a=hist(tmp,breaks=10,plot=F)
b=hist(tmp[1:100],breaks=a$breaks,plot=F)
c=hist(tmp[101:160],breaks=a$breaks,plot=F)
if((max(b$count)/100)>(max(c$count)/60)){
hist(tmp[1:100],breaks=a$breaks,col=rainbow(2,alpha=0.5)[1],xlab="",ylab="",main="");
e=hist(tmp[101:160],breaks=a$breaks,plot=F)
e$counts = e$counts*100/sum(e$counts)
plot(e,add=T,col=rainbow(2,alpha=0.5)[2],xlab="",ylab="",main="")
}else{
e=hist(tmp[101:160],breaks=a$breaks,plot=F)
e$counts = e$counts*100/sum(e$counts)
plot(e,col=rainbow(2,alpha=0.5)[2],xlab="",ylab="",main="",border=0)
hist(tmp[1:100],breaks=a$breaks,add=T,col=rainbow(2,alpha=0.5)[1],xlab="",ylab="",main="");
plot(e,add=T,col=rainbow(2,alpha=0.5)[2],xlab="",ylab="",main="")
}
}

最后終於大功告成,里面還有很多地方值得仔細研究。

例如:

  i.我兩組樣品的數量不一樣,但是我想在一個hist圖中比較,怎么辦?hist縱軸百分比顯示!!!

e=hist(tmp[101:160],breaks=a$breaks,plot=F)#先hist存到變量中
e$counts = e$counts*100/sum(e$counts) #將counts轉換成百分比
plot(e,add=T,col=rainbow(2,alpha=0.5)[2],xlab="",ylab="",main="")#再畫圖

  ii.我畫兩個具有一定透明度的hist,發覺畫圖先后順序對重疊部分的顏色有影響,例如我先畫紅色再畫藍色vs.先畫藍色再畫紅色,結果就不一樣了。

但是我又需要讓x軸和y軸依據最大的圖來確定。

所以我先根據所有數據來取breaks,保持兩個hist的break一致,這樣x軸問題就解決了;

然后判斷哪個hist的y值最大,那么我先根據最大的那個畫一個空白的hist,y軸問題解決;

然后再按照先紅后藍的順序畫上兩個hist。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM