R语言绘制双坐标图的案例详解

 更新时间:2023年01月07日 10:49:20   作者:Blackrosetian  
这篇文章主要介绍了R语言绘制双坐标图,下面就跟大家介绍plotrix包中的twoord.plot()函数和twoord.stackplot()函数,它们可以实现双坐标轴图形的绘制,需要的朋友可以参考下

之前推送了一系列关于使用ggplot2包绘制统计图形的文章,有网友询问是否可以绘制双轴的统计图形。很抱歉,Hradly在设计ggplot2包时就没有将双轴图形功能考虑进来。难道R语言就无法绘制双轴图形了吗?非也,R不仅是统计学家的标准工具,也是一款绘制图形的理想工具。下面就跟大家介绍plotrix包中的twoord.plot()函数和twoord.stackplot()函数,它们可以实现双坐标轴图形的绘制。

twoord.plot()函数语法及参数含义:

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:分别指定左坐标轴和右坐标轴的值,必须是连续的值

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'),
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 = ‘会员人数', rylab = ‘总消费额', type = c(‘line','line'))

虽然双坐标轴图形已经绘制好,但图中有几个不满意的地方:

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,
main = ‘双轴的两条线图', xlab = ‘月份', ylab = ‘会员人数', 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)')

这样的图形结果要比上面的图看起来舒服多了。如果想把左坐标轴的会员人数用条形图表示,右坐标轴的总消费额用线条表示,该如何操作呢?很简单,只需将type参数设置为(‘bar’,’line’)就可以了:

twoord.plot(lx = df1$Date, ly = df1$Consumers, rx = df1$Date, ry = df1$Amount,
lcol = ‘steelblue', main = ‘双轴的两条线图', xlab = ‘月份', ylab = ‘会员人数', 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)')

哎?又有问题了,这个条形图怎么这么细窄?超级难看。不要着急,只要稍稍调整halfwidth参数的大小即可,这里设置为8:

twoord.plot(lx = df1$Date, ly = df1$Consumers, rx = df1$Date, ry = df1$Amount,
lcol = ‘steelblue', main = ‘双轴的两条线图', xlab = ‘月份', ylab = ‘会员人数', 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()函数,直方图+核密度图是如何绘制的?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
= ‘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()函数,最后再介绍一种图,帕累托图形。即图形中包一个纵坐标轴表示绝对数量,另一个纵坐标轴表示累计百分比。实现该图脚本如下:

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 = ‘总数', rylab = ‘累计百分比%', main =
‘帕累托图', xtickpos=type, xticklab = c(‘A','B','C','D','E','F','G'))

下面再看一下twoord.stackplot()函数,该函数与twoord.plot()的不同之处在于,其可以绘制堆叠图,函数具体语法和参数含义如下:

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)

现在有一个场景是这样的,需要绘制某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,
lcol=c(‘steelblue','orange'), rcol='red', ltype=”bar”,
rtype='l', border=”grey80”, lylab = ‘人数', rylab = ‘新客比例', xlab='月份',
main='新老客占比', incrylim=0.1)

上图能够很高的看出新老客之间的数量对比,同时也能看出新客的趋势线,唯一不足的是,没有图例,下面就以图层的概念,在该图的基础上添加一下图例:

扩展绘图区域并添加图层

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)

非常完美,根据以上的场景要求,就绘制完一幅图形了,而且也能迅速的了解到图所表达的内容。

到此这篇关于R语言绘制双坐标图的文章就介绍到这了,更多相关R语言绘制双坐标图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • R语言 实现矩阵相乘100次

    R语言 实现矩阵相乘100次

    这篇文章主要介绍了R语言 实现矩阵相乘100次的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • R语言导入导出数据的几种方法汇总

    R语言导入导出数据的几种方法汇总

    这篇文章主要给大家总结介绍了R语言导入导出数据的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • R语言基本语法深入讲解

    R语言基本语法深入讲解

    这篇文章主要介绍了R语言基本语法深入讲解,文中内容介绍的很详细,有需要的同学可以研究下
    2021-03-03
  • R语言ggplot2 title设置教程(main,axis和legend titles)

    R语言ggplot2 title设置教程(main,axis和legend titles)

    ggplot2是一个强大的作图工具,它可以让你不受现有图形类型的限制,创造出任何有助于解决你所遇到问题的图形,下面这篇文章主要给大家介绍了关于R语言ggplot2 title设置(main,axis和legend titles)的相关资料,需要的朋友可以参考下
    2023-02-02
  • R语言-t分布正态分布分位数图的实例

    R语言-t分布正态分布分位数图的实例

    这篇文章主要介绍了R语言-t分布正态分布分位数图的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 用R语言实现霍夫曼编码的示例代码

    用R语言实现霍夫曼编码的示例代码

    这篇文章主要介绍了用R语言实现霍夫曼编码的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • R语言及其IDE(RStudio)下载安装详细流程

    R语言及其IDE(RStudio)下载安装详细流程

    这篇文章主要介绍了R语言及其IDE(RStudio)下载安装详细流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • pycharm实现R语言运行环境安装配置的实现步骤

    pycharm实现R语言运行环境安装配置的实现步骤

    大多数人仍然使用RStudio进行R语言开发。与RStudio相比,PyCharm具有更多的优势,本文主要介绍了pycharm运行R语言脚本的实现步骤,文中通过图文介绍的非常详细,感兴趣的可以了解一下
    2023-10-10
  • R语言操作XML文件实例分析

    R语言操作XML文件实例分析

    在本篇文章里小编给大家整理的是一篇关于R语言操作XML文件实例分析,有兴趣的朋友们可以跟着学习下。
    2021-05-05
  • R语言-实现提取包含某字符串的行变量

    R语言-实现提取包含某字符串的行变量

    这篇文章主要介绍了R语言-实现提取包含某字符串的行变量,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论