R語(yǔ)言繪制雙坐標(biāo)圖的案例詳解
之前推送了一系列關(guān)于使用ggplot2包繪制統(tǒng)計(jì)圖形的文章,有網(wǎng)友詢(xún)問(wèn)是否可以繪制雙軸的統(tǒng)計(jì)圖形。很抱歉,Hradly在設(shè)計(jì)ggplot2包時(shí)就沒(méi)有將雙軸圖形功能考慮進(jìn)來(lái)。難道R語(yǔ)言就無(wú)法繪制雙軸圖形了嗎?非也,R不僅是統(tǒng)計(jì)學(xué)家的標(biāo)準(zhǔn)工具,也是一款繪制圖形的理想工具。下面就跟大家介紹plotrix包中的twoord.plot()函數(shù)和twoord.stackplot()函數(shù),它們可以實(shí)現(xiàn)雙坐標(biāo)軸圖形的繪制。
twoord.plot()函數(shù)語(yǔ)法及參數(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:分別指定左坐標(biāo)軸和右坐標(biāo)軸的值,必須是連續(xù)的值
data:需要繪制雙軸圖形的數(shù)據(jù)框
main:為圖形指定標(biāo)題
xlim:限制橫坐標(biāo)值的范圍
lylim,rylim:限制左右縱坐標(biāo)值的范圍
mar:設(shè)置圖形邊界距,默認(rèn)值為(5,4,4,4)
lcol,rcol:設(shè)置左右坐標(biāo)軸的顏色,這樣可以起到圖例的作用
xlab:設(shè)置橫坐標(biāo)軸標(biāo)簽
lytickpos:設(shè)置左坐標(biāo)軸刻度標(biāo)簽的位置
ylab:設(shè)置左坐標(biāo)軸標(biāo)簽
ylab.at:設(shè)置左坐標(biāo)軸標(biāo)簽位置
rytickpos:設(shè)置右坐標(biāo)軸刻度標(biāo)簽的位置
rylab:設(shè)置又坐標(biāo)軸標(biāo)簽
rylab.at:設(shè)置右坐標(biāo)軸標(biāo)簽位置
lpch,rpch:設(shè)置左右坐標(biāo)軸圖形的外觀
type:指定圖形類(lèi)型
xtickpos:設(shè)置橫坐標(biāo)軸刻度標(biāo)簽位置
xticklab:設(shè)置橫坐標(biāo)軸刻度標(biāo)簽
halfwidth:設(shè)置用戶給定條形圖寬度的一半
axislab.cex:設(shè)置坐標(biāo)軸標(biāo)簽和刻度標(biāo)簽的大小
do.first:通過(guò)該參數(shù)可以往圖形中添加背景色或網(wǎng)格線
下面通過(guò)案例來(lái)說(shuō)明twoord.plot()函數(shù)的應(yīng)用:
library(plotrix)
繪制雙軸的兩個(gè)線圖
Date <- seq(from = as.Date(‘2015-01-01'), to = as.Date(‘2015-12-01'), by = ‘month') Consumers <- c(100,80,120,153,200,188,220,322,300,321,282,304) Amount <- c(1000,840,1458,1844,2045,2000,2548,5081,5000,5200,4800,4971) df1 <- data.frame(Date = Date, Consumers=Consumers, Amount = Amount) twoord.plot(lx = df1$Date, ly = df1$Consumers, rx = df1$Date, ry = df1$Amount, main = ‘雙軸的兩條線圖', xlab = ‘月份', ylab = ‘會(huì)員人數(shù)', rylab = ‘總消費(fèi)額', type = c(‘line','line'))
雖然雙坐標(biāo)軸圖形已經(jīng)繪制好,但圖中有幾個(gè)不滿意的地方:
1)橫坐標(biāo)軸的刻度標(biāo)簽不是正確的日期格式
2)右坐標(biāo)軸刻度標(biāo)簽很擠
3)圖形不炫酷,想添加背景色或網(wǎng)格線
好,這些不滿意的地方都不是問(wèn)題,twoord.plot()函數(shù)可以輕松搞定:
1)通過(guò)xticklab參數(shù)重新設(shè)置橫坐標(biāo)軸的刻度標(biāo)簽
2)通過(guò)rytickpos參數(shù)重新設(shè)置刻度標(biāo)簽
3)通過(guò)do.first參數(shù)給圖形添加背景色和網(wǎng)格線
twoord.plot(lx = df1$Date, ly = df1$Consumers, rx = df1$Date, ry = df1$Amount, main = ‘雙軸的兩條線圖', xlab = ‘月份', ylab = ‘會(huì)員人數(shù)', rylab = ‘總消費(fèi)額', type = c(‘line','line'), xtickpos=as.numeric(df1$Date), xticklab = as.character(df1$Date), rytickpos = seq(500,5000,by = 1500), do.first = ‘plot_bg(col = \'gray\'); grid(col = \'white\', lty = 2)')
這樣的圖形結(jié)果要比上面的圖看起來(lái)舒服多了。如果想把左坐標(biāo)軸的會(huì)員人數(shù)用條形圖表示,右坐標(biāo)軸的總消費(fèi)額用線條表示,該如何操作呢?很簡(jiǎn)單,只需將type參數(shù)設(shè)置為(‘bar’,’line’)就可以了:
twoord.plot(lx = df1$Date, ly = df1$Consumers, rx = df1$Date, ry = df1$Amount, lcol = ‘steelblue', main = ‘雙軸的兩條線圖', xlab = ‘月份', ylab = ‘會(huì)員人數(shù)', rylab = ‘總消費(fèi)額', type = c(‘bar','line'), xtickpos=as.numeric(df1$Date), xticklab = as.character(df1$Date), rytickpos = seq(500,5000,by = 1500), do.first = ‘plot_bg(col = \'gray\'); grid(col = \'white\', lty = 2)')
哎?又有問(wèn)題了,這個(gè)條形圖怎么這么細(xì)窄?超級(jí)難看。不要著急,只要稍稍調(diào)整halfwidth參數(shù)的大小即可,這里設(shè)置為8:
twoord.plot(lx = df1$Date, ly = df1$Consumers, rx = df1$Date, ry = df1$Amount, lcol = ‘steelblue', main = ‘雙軸的兩條線圖', xlab = ‘月份', ylab = ‘會(huì)員人數(shù)', rylab = ‘總消費(fèi)額', type = c(‘bar','line'), xtickpos=as.numeric(df1$Date), xticklab = as.character(df1$Date), rytickpos = seq(500,5000,by = 1500), halfwidth = 8, do.first = ‘plot_bg(col = \'gray\'); grid(col = \'white\', lty = 2)')
這會(huì)兒圖形正常了。還記得直方圖是如何繪制的嗎?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')
哎?核密度線怎么成了一條直線了?原來(lái)是因?yàn)橹狈綀D高度對(duì)于的頻次與核密度值不是一個(gè)量綱,即頻次在0~60之間,而核密度值在0~1之間。如果要使核密度曲線體現(xiàn)出來(lái),必須將hist()函數(shù)中freq參數(shù)設(shè)置為FALSE:
繪制直方圖和核密度圖
hist(x, breaks = 50, col = ‘steelblue', freq = FALSE) lines(density(x), col = ‘red', lwd=2)
如果我既想看到不同組的頻次,又想看到對(duì)應(yīng)的密度值該怎么辦呢?這個(gè)時(shí)候就需要繪制雙軸圖了:
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)
關(guān)于twoord.plot()函數(shù),最后再介紹一種圖,帕累托圖形。即圖形中包一個(gè)縱坐標(biāo)軸表示絕對(duì)數(shù)量,另一個(gè)縱坐標(biāo)軸表示累計(jì)百分比。實(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 = ‘累計(jì)百分比%', main = ‘帕累托圖', xtickpos=type, xticklab = c(‘A','B','C','D','E','F','G'))
下面再看一下twoord.stackplot()函數(shù),該函數(shù)與twoord.plot()的不同之處在于,其可以繪制堆疊圖,函數(shù)具體語(yǔ)法和參數(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:指定左右橫坐標(biāo)軸的值
ldata,rdata:指定左右縱坐標(biāo)軸的值
lcol, rcol:指定左右坐標(biāo)軸的顏色
ltype, rtype:指定左右坐標(biāo)軸線的類(lèi)型
border:指定條形圖邊框顏色
rylab,lylab:指定左右縱坐標(biāo)軸標(biāo)簽
xlab:指定橫坐標(biāo)軸標(biāo)簽
incrylim:增加坐標(biāo)軸值的范圍
halfwidth:設(shè)置用戶給定條形圖寬度的一半
leftfront:如果leftfront設(shè)置為T(mén)RUE的話,則左坐標(biāo)軸將置于頂層
mar:設(shè)置圖形邊界距,默認(rèn)值為(5,4,4,4)
現(xiàn)在有一個(gè)場(chǎng)景是這樣的,需要繪制某APP在2015年各月中新老會(huì)員人數(shù)及新會(huì)員所占比重:
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ù)量對(duì)比,同時(shí)也能看出新客的趨勢(shì)線,唯一不足的是,沒(méi)有圖例,下面就以圖層的概念,在該圖的基礎(chǔ)上添加一下圖例:
擴(kuò)展繪圖區(qū)域并添加圖層
par(xpd=TRUE) par(new=TRUE)
在原來(lái)圖形的基礎(chǔ)上繪制一張空?qǐng)D
plot(0:1, 0:1, type=”n”, xlab=””,ylab=””, axes=FALSE)
添加左坐標(biāo)軸軸圖例
legend(0, 1.5, leg=c(‘老客', ‘新客'), fill=c(‘steelblue','orange'), bty = ‘n')
添加右坐標(biāo)軸軸圖例
legend(-0.03, 1.25, leg='新客比例', col='red', lty = 1, bty = ‘n') par(xpd=FALSE, new=FALSE)
非常完美,根據(jù)以上的場(chǎng)景要求,就繪制完一幅圖形了,而且也能迅速的了解到圖所表達(dá)的內(nèi)容。
到此這篇關(guān)于R語(yǔ)言繪制雙坐標(biāo)圖的文章就介紹到這了,更多相關(guān)R語(yǔ)言繪制雙坐標(biāo)圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
R語(yǔ)言導(dǎo)入導(dǎo)出數(shù)據(jù)的幾種方法匯總
這篇文章主要給大家總結(jié)介紹了R語(yǔ)言導(dǎo)入導(dǎo)出數(shù)據(jù)的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03R語(yǔ)言ggplot2?title設(shè)置教程(main,axis和legend?titles)
ggplot2是一個(gè)強(qiáng)大的作圖工具,它可以讓你不受現(xiàn)有圖形類(lèi)型的限制,創(chuàng)造出任何有助于解決你所遇到問(wèn)題的圖形,下面這篇文章主要給大家介紹了關(guān)于R語(yǔ)言ggplot2?title設(shè)置(main,axis和legend?titles)的相關(guān)資料,需要的朋友可以參考下2023-02-02R語(yǔ)言-t分布正態(tài)分布分位數(shù)圖的實(shí)例
這篇文章主要介紹了R語(yǔ)言-t分布正態(tài)分布分位數(shù)圖的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04用R語(yǔ)言實(shí)現(xiàn)霍夫曼編碼的示例代碼
這篇文章主要介紹了用R語(yǔ)言實(shí)現(xiàn)霍夫曼編碼的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03R語(yǔ)言及其IDE(RStudio)下載安裝詳細(xì)流程
這篇文章主要介紹了R語(yǔ)言及其IDE(RStudio)下載安裝詳細(xì)流程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03pycharm實(shí)現(xiàn)R語(yǔ)言運(yùn)行環(huán)境安裝配置的實(shí)現(xiàn)步驟
大多數(shù)人仍然使用RStudio進(jìn)行R語(yǔ)言開(kāi)發(fā)。與RStudio相比,PyCharm具有更多的優(yōu)勢(shì),本文主要介紹了pycharm運(yùn)行R語(yǔ)言腳本的實(shí)現(xiàn)步驟,文中通過(guò)圖文介紹的非常詳細(xì),感興趣的可以了解一下2023-10-10R語(yǔ)言-實(shí)現(xiàn)提取包含某字符串的行變量
這篇文章主要介紹了R語(yǔ)言-實(shí)現(xiàn)提取包含某字符串的行變量,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04