利用R绘制双坐标轴图

plotrix包中的twoord.plot()函数和twoord.stackplot()函数,它们可以实现双坐标轴图形的绘制。

(1)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(lx=bwt$年份,ly=bwt$表型值,rx=bwt$年份,ry=bwt$育种值,

            main='初生重的表型和遗传变化趋势',xlab='年份',ylab='表型值',

            rylab='育种值',type=c('b','b'))


增加网格线:

twoord.plot(lx=bwt$年份,ly=bwt$表型值,rx=bwt$年份,ry=bwt$育种值,

            main='初生重的表型和遗传变化趋势',xlab='年份',ylab='表型值',

            rylab='育种值',type=c('b','b'),do.first = 'plot_bg(col =\'gray\');

            grid(col= \'white\', lty = 2)')

如果想把左坐标轴的表型值用条形图表示,右坐标轴的育种值用线条表示,该如何操作呢?很简单,只需将type参数设置为(‘bar’,’line’)就可以了

twoord.plot(lx=bwt$年份,ly=bwt$表型值,rx=bwt$年份,ry=bwt$育种值,

            main='初生重的表型和遗传变化趋势',xlab='年份',ylab='表型值',

            rylab='育种值',type=c('bar','line'),do.first = 'plot_bg(col =\'gray\');

            grid(col= \'white\', lty = 2)')

这个条形图怎么设置细窄?不要着急,只要稍稍调整halfwidth参数的大小即可,这里设置为0.1:

twoord.plot(lx=bwt$年份,ly=bwt$表型值,rx=bwt$年份,ry=bwt$育种值,

            main='初生重的表型和遗传变化趋势',xlab='年份',ylab='表型值',

            rylab='育种值',type=c('bar','line'), halfwidth= 0.1, do.first = 'plot_bg(col =\'gray\');

            grid(col= \'white\', lty = 2)')


以下内容是转载数据人网和原文链接:http://shujuren.org/index.php/Article/update/aid/163

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)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容