利用R繪制雙坐標軸圖

plotrix包中的twoord.plot()函數(shù)和twoord.stackplot()函數(shù),它們可以實現(xiàn)雙坐標軸圖形的繪制。

(1)twoord.plot()函數(shù)語法及參數(shù)含義:

twoord.plot(lx,ly,rx,ry,data=NULL,main="",xlim=NULL,lylim=NULL,rylim=NULL,mar=c(5,4,4,4),lcol=1,rcol=2,

? ? ? ? xlab="",lytickpos=NA,ylab="",ylab.at=NA,rytickpos=NA,rylab="",rylab.at=NA,lpch=1,rpch=2,

? ? ? ? type="b",xtickpos=NULL,xticklab=NULL,halfwidth=0.4,axislab.cex=1,do.first=NULL,...)

lx,ly,rx,ry:分別指定左坐標軸和右坐標軸的值,必須是連續(xù)的值

data:需要繪制雙軸圖形的數(shù)據(jù)框

main:為圖形指定標題

xlim:限制橫坐標值的范圍

lylim,rylim:限制左右縱坐標值的范圍

mar:設置圖形邊界距,默認值為(5,4,4,4)

lcol,rcol:設置左右坐標軸的顏色,這樣可以起到圖例的作用

xlab:設置橫坐標軸標簽

lytickpos:設置左坐標軸刻度標簽的位置

ylab:設置左坐標軸標簽

ylab.at:設置左坐標軸標簽位置

rytickpos:設置右坐標軸刻度標簽的位置

rylab:設置又坐標軸標簽

rylab.at:設置右坐標軸標簽位置

lpch,rpch:設置左右坐標軸圖形的外觀

type:指定圖形類型

xtickpos:設置橫坐標軸刻度標簽位置

xticklab:設置橫坐標軸刻度標簽

halfwidth:設置用戶給定條形圖寬度的一半

axislab.cex:設置坐標軸標簽和刻度標簽的大小

do.first:通過該參數(shù)可以往圖形中添加背景色或網(wǎng)格線

例如:

twoord.plot(lx=bwt$年份,ly=bwt$表型值,rx=bwt$年份,ry=bwt$育種值,

? ? ? ? ? ? main='初生重的表型和遺傳變化趨勢',xlab='年份',ylab='表型值',

? ? ? ? ? ? rylab='育種值',type=c('b','b'))


增加網(wǎng)格線:

twoord.plot(lx=bwt$年份,ly=bwt$表型值,rx=bwt$年份,ry=bwt$育種值,

? ? ? ? ? ? main='初生重的表型和遺傳變化趨勢',xlab='年份',ylab='表型值',

? ? ? ? ? ? rylab='育種值',type=c('b','b'),do.first = 'plot_bg(col =\'gray\');

? ? ? ? ? ? grid(col= \'white\', lty = 2)')

如果想把左坐標軸的表型值用條形圖表示,右坐標軸的育種值用線條表示,該如何操作呢?很簡單,只需將type參數(shù)設置為(‘bar’,’line’)就可以了

twoord.plot(lx=bwt$年份,ly=bwt$表型值,rx=bwt$年份,ry=bwt$育種值,

? ? ? ? ? ? main='初生重的表型和遺傳變化趨勢',xlab='年份',ylab='表型值',

? ? ? ? ? ? rylab='育種值',type=c('bar','line'),do.first = 'plot_bg(col =\'gray\');

? ? ? ? ? ? grid(col= \'white\', lty = 2)')

這個條形圖怎么設置細窄?不要著急,只要稍稍調整halfwidth參數(shù)的大小即可,這里設置為0.1:

twoord.plot(lx=bwt$年份,ly=bwt$表型值,rx=bwt$年份,ry=bwt$育種值,

? ? ? ? ? ? main='初生重的表型和遺傳變化趨勢',xlab='年份',ylab='表型值',

? ? ? ? ? ? rylab='育種值',type=c('bar','line'), halfwidth= 0.1, do.first = 'plot_bg(col =\'gray\');

? ? ? ? ? ? grid(col= \'white\', lty = 2)')


以下內容是轉載數(shù)據(jù)人網(wǎng)和原文鏈接:http://shujuren.org/index.php/Article/update/aid/163

hist()函數(shù),直方圖+核密度圖是如何繪制的?hist()函數(shù)+lines()函數(shù):

set.seed(1000)

x = rnorm(1000,10,3)

h <- hist(x, breaks = 50)

繪制直方圖和核密度圖

hist(x, breaks = 50, col = ‘steelblue’)

lines(density(x), col = ‘red’)

哎?核密度線怎么成了一條直線了?原來是因為直方圖高度對于的頻次與核密度值不是一個量綱,即頻次在0~60之間,而核密度值在0~1之間。如果要使核密度曲線體現(xiàn)出來,必須將hist()函數(shù)中freq參數(shù)設置為FALSE:

繪制直方圖和核密度圖

hist(x, breaks = 50, col = ‘steelblue’, freq = FALSE)

lines(density(x), col = ‘red’, lwd=2)

如果我既想看到不同組的頻次,又想看到對應的密度值該怎么辦呢?這個時候就需要繪制雙軸圖了:

x1 <- h$mids

y1 <- h$counts

x2 <- seq(min(x), max(x), by = 0.01)

y2 <- dnorm(seq(min(x), max(x), by = 0.01),10,3)

twoord.plot(lx = x1, ly = y1, rx = x2, ry = y2, type=c(‘bar’,’l’), lcol

= ‘steelblue’, rcol = ‘red’, ylab = ‘Counts’, rylab = ‘Density’, main =

‘Histogram and density curve’, halfwidth=0.2, lylim = c(0,max(y1)+1), rylim

= c(0,0.2),lwd=2)

關于twoord.plot()函數(shù),最后再介紹一種圖,帕累托圖形。即圖形中包一個縱坐標軸表示絕對數(shù)量,另一個縱坐標軸表示累計百分比。實現(xiàn)該圖腳本如下:

type <- 1:7

absolute <- c(12,15,20,28,11,5,7)

cum_per <- cumsum(absolute)/sum(absolute)

twoord.plot(lx = type, ly = absolute, rx = type, ry = cum_per, type=c(‘bar’,’l’),

lcol = ‘steelblue’, rcol = ‘red’, ylab = ‘總數(shù)’, rylab = ‘累計百分比%’, main =

‘帕累托圖’, xtickpos=type, xticklab = c(‘A’,’B’,’C’,’D’,’E’,’F’,’G’))

下面再看一下twoord.stackplot()函數(shù),該函數(shù)與twoord.plot()的不同之處在于,其可以繪制堆疊圖,函數(shù)具體語法和參數(shù)含義如下:

twoord.stackplot(lx, rx, ldata, rdata,

? ? ? ? ? lcol, rcol, ltype, rtype,

? ? ? ? ? border, rylab, lylab,

xlab,

? ? ? ? ? ..., incrylim=NULL,halfwidth=0.4,

? ? ? ? ? leftfront=FALSE,

? ? ? ? ? mar = c(5, 4, 4, 4))

lx,rx:指定左右橫坐標軸的值

ldata,rdata:指定左右縱坐標軸的值

lcol, rcol:指定左右坐標軸的顏色

ltype, rtype:指定左右坐標軸線的類型

border:指定條形圖邊框顏色

rylab,lylab:指定左右縱坐標軸標簽

xlab:指定橫坐標軸標簽

incrylim:增加坐標軸值的范圍

halfwidth:設置用戶給定條形圖寬度的一半

leftfront:如果leftfront設置為TRUE的話,則左坐標軸將置于頂層

mar:設置圖形邊界距,默認值為(5,4,4,4)

現(xiàn)在有一個場景是這樣的,需要繪制某APP在2015年各月中新老會員人數(shù)及新會員所占比重

set.seed(1111)

Date <- 1:12

Old <- round(runif(12, 100,300))

New <- round(runif(12, 50,120))

Ratio <- New/(New+Old)

twoord.stackplot(lx=Date, rx=Date, ldata=cbind(Old, New), rdata=Ratio,

lcol=c(‘steelblue’,’orange’), rcol=’red’, ltype=”bar”,

rtype=’l’, border=”grey80”, lylab = ‘人數(shù)’, rylab = ‘新客比例’, xlab=’月份’,

main=’新老客占比’, incrylim=0.1)

上圖能夠很高的看出新老客之間的數(shù)量對比,同時也能看出新客的趨勢線,唯一不足的是,沒有圖例,下面就以圖層的概念,在該圖的基礎上添加一下圖例:

擴展繪圖區(qū)域并添加圖層

par(xpd=TRUE)

par(new=TRUE)

在原來圖形的基礎上繪制一張空圖

plot(0:1, 0:1, type=”n”, xlab=””,ylab=””,

axes=FALSE)

添加左坐標軸軸圖例

legend(0, 1.5, leg=c(‘老客’, ‘新客’), fill=c(‘steelblue’,’orange’), bty =

‘n’)

添加右坐標軸軸圖例

legend(-0.03, 1.25, leg=’新客比例’, col=’red’, lty = 1, bty = ‘n’)

par(xpd=FALSE, new=FALSE)

非常完美,根據(jù)以上的場景要求,就繪制完一幅圖形了,而且也能迅速的了解到圖所表達的內容。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容