網(wǎng)站首頁 編程語言 正文
之前推送了一系列關(guān)于使用ggplot2包繪制統(tǒng)計圖形的文章,有網(wǎng)友詢問是否可以繪制雙軸的統(tǒng)計圖形。很抱歉,Hradly在設計ggplot2包時就沒有將雙軸圖形功能考慮進來。難道R語言就無法繪制雙軸圖形了嗎?非也,R不僅是統(tǒng)計學家的標準工具,也是一款繪制圖形的理想工具。下面就跟大家介紹plotrix包中的twoord.plot()函數(shù)和twoord.stackplot()函數(shù),它們可以實現(xiàn)雙坐標軸圖形的繪制。
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()函數(shù)的應用:
library(plotrix)
繪制雙軸的兩個線圖
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 = ‘會員人數(shù)', rylab = ‘總消費額', type = c(‘line','line'))
雖然雙坐標軸圖形已經(jīng)繪制好,但圖中有幾個不滿意的地方:
1)橫坐標軸的刻度標簽不是正確的日期格式
2)右坐標軸刻度標簽很擠
3)圖形不炫酷,想添加背景色或網(wǎng)格線
好,這些不滿意的地方都不是問題,twoord.plot()函數(shù)可以輕松搞定:
1)通過xticklab參數(shù)重新設置橫坐標軸的刻度標簽
2)通過rytickpos參數(shù)重新設置刻度標簽
3)通過do.first參數(shù)給圖形添加背景色和網(wǎng)格線
twoord.plot(lx = df1$Date, ly = df1$Consumers, rx = df1$Date, ry = df1$Amount,
main = ‘雙軸的兩條線圖', xlab = ‘月份', ylab = ‘會員人數(shù)', rylab = ‘總消費額', 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é)果要比上面的圖看起來舒服多了。如果想把左坐標軸的會員人數(shù)用條形圖表示,右坐標軸的總消費額用線條表示,該如何操作呢?很簡單,只需將type參數(shù)設置為(‘bar’,’line’)就可以了:
twoord.plot(lx = df1$Date, ly = df1$Consumers, rx = df1$Date, ry = df1$Amount,
lcol = ‘steelblue', main = ‘雙軸的兩條線圖', xlab = ‘月份', ylab = ‘會員人數(shù)', rylab
= ‘總消費額', 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)')
哎?又有問題了,這個條形圖怎么這么細窄?超級難看。不要著急,只要稍稍調(diào)整halfwidth參數(shù)的大小即可,這里設置為8:
twoord.plot(lx = df1$Date, ly = df1$Consumers, rx = df1$Date, ry = df1$Amount,
lcol = ‘steelblue', main = ‘雙軸的兩條線圖', xlab = ‘月份', ylab = ‘會員人數(shù)', rylab
= ‘總消費額', 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)')
這會兒圖形正常了。還記得直方圖是如何繪制的嗎?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)
關(guān)于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ù)量對比,同時也能看出新客的趨勢線,唯一不足的是,沒有圖例,下面就以圖層的概念,在該圖的基礎(chǔ)上添加一下圖例:
擴展繪圖區(qū)域并添加圖層
par(xpd=TRUE)
par(new=TRUE)
在原來圖形的基礎(chǔ)上繪制一張空圖
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ù)以上的場景要求,就繪制完一幅圖形了,而且也能迅速的了解到圖所表達的內(nèi)容。
原文鏈接:https://blog.csdn.net/Blackrosetian/article/details/78891578
相關(guān)推薦
- 2022-07-27 C++中this指針理解及作用_C 語言
- 2021-10-09 OpenCV提取圖像中圓線上的數(shù)據(jù)具體流程_C 語言
- 2022-09-30 Python使用draw類繪制圖形示例講解_python
- 2022-04-16 pycharm全局修改方式_python
- 2022-10-15 python中mpi4py的所有基礎(chǔ)使用案例詳解_python
- 2022-06-04 Android自定義ScrollView實現(xiàn)阻尼回彈_Android
- 2022-06-15 Python中的?any()?函數(shù)和?all()?函數(shù)_python
- 2022-11-25 詳解C++中類的六大默認成員函數(shù)_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支