在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
之前公众号推送了一系列关于使用ggplot2包绘制统计图形的文章,有网友询问是否可以绘制双轴的统计图形。很抱歉,Hradly在设计ggplot2包时就没有将双轴图形功能考虑进来。难道R语言就无法绘制双轴图形了吗?非也,R不仅是统计学家的标准工具,也是一款绘制图形的理想工具。下面就跟大家介绍plotrix包中的twoord.plot()函数和twoord.stackplot()函数,它们可以实现双坐标轴图形的绘制。 twoord.plot()函数语法及参数含义:
lx,ly,rx,ry:分别指定左坐标轴和右坐标轴的值,必须是连续的值 data:需要绘制双轴图形的数据框 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:通过该参数可以往图形中添加背景色或网格线 下面通过案例来说明twoord.plot()函数的应用: library(plotrix) 绘制双轴的两个线图
Date <- seq(from = as.Date(‘2015-01-01’), to = as.Date(‘2015-12-01’), 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,
虽然双坐标轴图形已经绘制好,但图中有几个不满意的地方: 1)横坐标轴的刻度标签不是正确的日期格式 2)右坐标轴刻度标签很挤 3)图形不炫酷,想添加背景色或网格线 好,这些不满意的地方都不是问题,twoord.plot()函数可以轻松搞定: 1)通过xticklab参数重新设置横坐标轴的刻度标签 2)通过rytickpos参数重新设置刻度标签 3)通过do.first参数给图形添加背景色和网格线
twoord.plot(lx = df1$Date, ly = df1$Consumers, rx = df1$Date, ry = df1$Amount,
这样的图形结果要比上面的图看起来舒服多了。如果想把左坐标轴的会员人数用条形图表示,右坐标轴的总消费额用线条表示,该如何操作呢?很简单,只需将type参数设置为(‘bar’,’line’)就可以了:
twoord.plot(lx = df1$Date, ly = df1$Consumers, rx = df1$Date, ry = df1$Amount,
哎?又有问题了,这个条形图怎么这么细窄?超级难看。不要着急,只要稍稍调整halfwidth参数的大小即可,这里设置为8:
twoord.plot(lx = df1$Date, ly = df1$Consumers, rx = df1$Date, ry = df1$Amount,
这会儿图形正常了。还记得直方图是如何绘制的吗?hist()函数,直方图+核密度图是如何绘制的?hist()函数+lines()函数: 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之间。如果要使核密度曲线体现出来,必须将hist()函数中freq参数设置为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
关于twoord.plot()函数,最后再介绍一种图,帕累托图形。即图形中包一个纵坐标轴表示绝对数量,另一个纵坐标轴表示累计百分比。实现该图脚本如下: 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’),
下面再看一下twoord.stackplot()函数,该函数与twoord.plot()的不同之处在于,其可以绘制堆叠图,函数具体语法和参数含义如下: twoord.stackplot(lx, rx, ldata, rdata,
xlab,
lx,rx:指定左右横坐标轴的值 ldata,rdata:指定左右纵坐标轴的值 lcol, rcol:指定左右坐标轴的颜色 ltype, rtype:指定左右坐标轴线的类型 border:指定条形图边框颜色 rylab,lylab:指定左右纵坐标轴标签 xlab:指定横坐标轴标签 incrylim:增加坐标轴值的范围 halfwidth:设置用户给定条形图宽度的一半 leftfront:如果leftfront设置为TRUE的话,则左坐标轴将置于顶层 mar:设置图形边界距,默认值为(5,4,4,4) 现在有一个场景是这样的,需要绘制某APP在2015年各月中新老会员人数及新会员所占比重: 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,
上图能够很高的看出新老客之间的数量对比,同时也能看出新客的趋势线,唯一不足的是,没有图例,下面就以图层的概念,在该图的基础上添加一下图例: 扩展绘图区域并添加图层par(xpd=TRUE) par(new=TRUE) 在原来图形的基础上绘制一张空图
plot(0:1, 0:1, type=”n”, xlab=””,ylab=””, 添加左坐标轴轴图例
legend(0, 1.5, leg=c(‘老客’, ‘新客’), fill=c(‘steelblue’,’orange’), bty =
全部评论
专题导读
上一篇:《R语言与数据挖掘最佳实践和经典案例》—— 2.4 通过ODBC导入与导出数据 ...发布时间:2022-07-18下一篇:【R语言】基本数据管理(带练习题)发布时间:2022-07-18热门推荐
热门话题
阅读排行榜
|
请发表评论