• 主页
  • 课程

    关于课程

    • 课程归档
    • 成为一名讲师
    • 讲师信息
    同等学历教学

    同等学历教学

    免费
    阅读更多
  • 特色
    • 展示
    • 关于我们
    • 问答
  • 事件
  • 个性化
  • 博客
  • 联系
  • 站点资源
    有任何问题吗?
    (00) 123 456 789
    weinfoadmin@weinformatics.cn
    注册登录
    恒诺新知
    • 主页
    • 课程

      关于课程

      • 课程归档
      • 成为一名讲师
      • 讲师信息
      同等学历教学

      同等学历教学

      免费
      阅读更多
    • 特色
      • 展示
      • 关于我们
      • 问答
    • 事件
    • 个性化
    • 博客
    • 联系
    • 站点资源

      R语言

      • 首页
      • 博客
      • R语言
      • 【R画图】使用R绘制几种常用的双坐标轴图形

      【R画图】使用R绘制几种常用的双坐标轴图形

      • 发布者 weinfoadmin
      • 分类 R语言
      • 日期 2016年2月20日
      测试开头

      之前公众号推送了一系列关于使用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'))

      【R画图】使用R绘制几种常用的双坐标轴图形

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

      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)')

      【R画图】使用R绘制几种常用的双坐标轴图形

      这样的图形结果要比上面的图看起来舒服多了。如果想把左坐标轴的会员人数用条形图表示,右坐标轴的总消费额用线条表示,该如何操作呢?很简单,只需将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)')

      【R画图】使用R绘制几种常用的双坐标轴图形

      哎?又有问题了,这个条形图怎么这么细窄?超级难看。不要着急,只要稍稍调整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)')

      【R画图】使用R绘制几种常用的双坐标轴图形

      这会儿图形正常了。还记得直方图是如何绘制的吗?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')

      【R画图】使用R绘制几种常用的双坐标轴图形

      哎?核密度线怎么成了一条直线了?原来是因为直方图高度对于的频次与核密度值不是一个量纲,即频次在0~60之间,而核密度值在0~1之间。如果要使核密度曲线体现出来,必须将hist()函数中freq参数设置为FALSE:

      #绘制直方图和核密度图

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

      lines(density(x), col = 'red', lwd=2)

      【R画图】使用R绘制几种常用的双坐标轴图形

      如果我既想看到不同组的频次,又想看到对应的密度值该怎么办呢?这个时候就需要绘制双轴图了:

      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)

      【R画图】使用R绘制几种常用的双坐标轴图形

      关于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'))

      【R画图】使用R绘制几种常用的双坐标轴图形

      下面再看一下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)

      【R画图】使用R绘制几种常用的双坐标轴图形

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

      #扩展绘图区域并添加图层

      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语言,目前自学Python语言。

      严禁修改,可以转载,请注明出自数据人网和原文链接:http://shujuren.org/index.php/Article/update/aid/163


      更多精彩内容,请点击阅读原文。

      数据人网(http://shujuren.org),数据人学习、交流和分享的家园,专注于从数据中学习,努力发觉数据之洞见,积极利用数据之价值。为“让人懂数据、用数据”之使命坚持做点事情。大家可以来投稿,做分享和传播,可以给反馈。您有什么想法,请反馈给我们,谢谢。数据人网,我们共建和共享。

      数据人网构建了数据人圈子,诚邀热爱数据和利用数据朋友入群。加小编微信:luqin360,注明入圈子。


      测试结尾

      请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!

      • 分享:
      作者头像
      weinfoadmin

      上一篇文章

      【数据整理】如何使用R语言解决可恶的脏数据
      2016年2月20日

      下一篇文章

      【R画图】R语言与Tableau集成之可视化应用
      2016年2月22日

      你可能也喜欢

      3-1665801675
      R语言学习:重读《R数据科学(中文版)》书籍
      28 9月, 2022
      6-1652833487
      经典铁死亡,再出新思路
      16 5月, 2022
      1-1651501980
      R语言学习:阅读《R For Everyone 》(第二版)
      1 5月, 2022

      搜索

      分类

      • R语言
      • TCGA数据挖掘
      • 单细胞RNA-seq测序
      • 在线会议直播预告与回放
      • 数据分析那些事儿分类
      • 未分类
      • 生信星球
      • 老俊俊的生信笔记

      投稿培训

      免费

      alphafold2培训

      免费

      群晖配置培训

      免费

      最新博文

      Nature | 单细胞技术揭示衰老细胞与肌肉再生
      301月2023
      lncRNA和miRNA生信分析系列讲座免费视频课和课件资源包,干货满满
      301月2023
      如何快速批量修改 Git 提交记录中的用户信息
      261月2023
      logo-eduma-the-best-lms-wordpress-theme

      (00) 123 456 789

      weinfoadmin@weinformatics.cn

      恒诺新知

      • 关于我们
      • 博客
      • 联系
      • 成为一名讲师

      链接

      • 课程
      • 事件
      • 展示
      • 问答

      支持

      • 文档
      • 论坛
      • 语言包
      • 发行状态

      推荐

      • iHub汉语代码托管
      • iLAB耗材管理
      • WooCommerce
      • 丁香园论坛

      weinformatics 即 恒诺新知。ICP备案号:粤ICP备19129767号

      • 关于我们
      • 博客
      • 联系
      • 成为一名讲师

      要成为一名讲师吗?

      加入数以千计的演讲者获得100%课时费!

      现在开始

      用你的站点账户登录

      忘记密码?

      还不是会员? 现在注册

      注册新帐户

      已经拥有注册账户? 现在登录

      close
      会员购买 你还没有登录,请先登录
      • ¥99 VIP-1个月
      • ¥199 VIP-半年
      • ¥299 VIP-1年
      在线支付 激活码

      立即支付
      支付宝
      微信支付
      请使用 支付宝 或 微信 扫码支付
      登录
      注册|忘记密码?