R语言怎么用极坐标公式 画图画图

R语言绘图学习笔记:初识
R语言是我最近接触的一门用于数据分析的编程语言,虽然邂逅才短短两周,但深感其功能之强大,分析绘图能力尤其让人震撼。以下是我近期学习使用R语言的一些心得。
1、如何读取源数据?
我习惯于从.CSV文件中读取数据,主要用到read.csv()命令(见示例),其中参数“header=T”表示源文件第一行为列名称,“dec='.'”指定小数点符号为“.”。需要注意的是:文件“example.csv”一定要存放在R的当前工作目录下,否则是读不到的。
#显示当前工作目录,核查数据文件是否在目录下
#读取“example.csv”文件内容
test&-read.csv('example.csv',header=T,dec='.')
#显示测试数据的前几行,共三列:分别是时间、类型、数据值
head(test)
#显示测试数据的统计特性
summary(test)
2、如何绘制箱图?
使用R语言中绘制箱图是一件轻松愉快的事情,把数据交给R,一条plot()命令(没错!plot()就能绘制箱图),它就能给你返回想要的箱图。在此,不得不提R语言具有非常便捷数据索引功能,使用test$type即可提取测试数据中名为type的列,同理可提取名为data的列,plot函数可自动根据数据类型进行判断,决定是否绘制箱图。
#利用R语言的索引功能提取我想用来绘制图形的基础数据
#tx为箱图的横轴,表示数据的类型(包括TYPE-A、TYPE-B和TYPE-C)
tx&-test$type
#ty为箱图的纵轴,表示每种类型对应的数据值
ty&-test$data
#plot命令绘制箱图,其中xlab、ylab分别为横轴、纵轴标注,main为标题
plot(tx,ty,xlab="类型",ylab="数据值",main="箱图")
3、如何获取绘图中某一点的坐标信息?
例如想要获取上图中TYPE-A对应箱图的上边界和下边界位置,应用locator()命令即可。
#locator(n),n表示鼠标可以点两次,点击后返回所点位置的坐标。
locator(2)
4、如何绘制时间序列图?
依然是plot()命令,给它合适的数据类型,它就能帮你绘制时间序列图;当然了,首先你得将横坐标数据转换为R语言可以识别的时间类型,这里用到的基本函数是strptime(),它负责将字符串转换为标准的时间格式数据。
#tx1为时序图的横轴
tx1&-test$time
#查看tx1数据类型
#将tx1转换为标准时间类型,其中format需要匹配tx1源数据的形式
#本案例中,tx1的基本形式如“
23:00”,即“%Y/%m/%d
tx1&-strptime(tx1,format='%Y/%m/%d
#再次查看tx1数据类型
#可见经过类型转换的tx1已经自带时区标记“CST”
#ty1为时序图的纵轴,表示数据
ty1&-test$data
#plot命令绘制时间序列图,自动识别为采用星期标注
plot(tx1,ty1,xlab="时间",ylab="数据值",main="时间序列图")
5、如何更改时序图的日期标注?
使用坐标绘制函数axis.POSIXct()即可添加时间序列标注,但在此之前需要先通过plot()函数中的xaxt和yaxt参数阻止原始坐标的生成。
#xaxt=”n”可绘制出x轴无标注的图形,以便我们添加自己想要的x轴标注
plot(tx1,ty1,xlab="时间",ylab="数据值",main="时间序列图",xaxt=”n”)
#在1月8日、1月10日处添加标注,第一个参数“1”表示操作对象为底部的坐标,参数中数字的含义如下:1为底部,2为左边,3为上边,4为右边。
axis.POSIXct(1,at=c("",""),labels=c("1月8日","1月10日"))
6、如何在同一窗口中绘制2张图?
使用强大的图形参数控制函数par()即可,参数mfrow、mfcol均可作为控制参数,不同点在于使用mfrow参数时按行优先来排列图形,使用mfcol参数时则按列优先来排列图形。
#图形绘制框设为2行1列,可绘制2张图
par(mfrow=c(2,1)
#绘制第1张图
plot(tx,ty)
#绘制第2张图
plot(tx1,ty1)
7、如何控制坐标轴标注的字体和字号?
同样的,使用图形参数控制函数par()即可。
font.lab表示坐标轴标注字体,font.axis表示坐标轴字体,数字1、2、3、4分别表示正常、加粗、斜体以及斜体加粗;
cex.lab表示坐标轴标注字号,cex.axis表示坐标轴字号,1.5表示字号为正常的1.5倍。
par(font.lab=2,font.axis=2,cex.lab=1.5,cex.axis=1.5)
plot(tx1,ty1,xlab="时间",ylab="数据值",main="时间序列图")
8、如何为时间序列图添加辅助线?
一般添加辅助线使用abline()函数即可,为时序图添加辅助线的不同在于:首先你得生成一个标准的时间数据。
#绘制辅助线,1月7日
dt1=as.POSIXct("
00:00:00 CST")
abline(v=dt1,col="red",lty=2)
9、如何批量输出绘图到文件中?
借助for循环,R中的for循环相当的简单易用,示例如下。
ttype=levels(test$type)
tlen=length(ttype)
#分别绘制3种类型数据的时间序列图,并输出到文件
for(tmpname in
dts=strptime(test[test$type==tmpname,1],format='%Y/%m/%d
ddata=test[test$type==tmpname,3]
fname=paste(tmpname,".jpeg",sep="")
jpeg(filename=fname,height=th,width=tw)
par(font.lab=2,font.axis=2,cex.lab=1.5,cex.axis=1.5)
plot(dts,ddata,xlab="时间",ylab="数据",main=tmpname)
dev.off(2)
10、如何更改help显示的模式?
使用环境设置函数options(),可设置help_type为html,即通过网页查看帮助信息;也可设置为"text"或"pdf",则通过文本或pdf文件的方式查看帮助信息。
options(help_type="html")
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
2、多面板盒形图(bwplot)
数据:同上
要求:对sal和month画盒形图,要求按area分
jpeg("tu2.jpg")bwplot(SAL~factor(Month)|Area,cex=0.5,layout=c(2,5),data=z,xlab="month",ylab="salinity",parsettings=list(box.rectangle=list(col=3),box.umbrella=list(col=3),plot.symbol=list(cex=0.5,col=1)))dev.off()
注意:layout是布局,注意和mfrow效果是反的,后面的parsettings表示对框的颜色,线条颜色和中位数点的尺寸和颜色(好像效果不明显)
&3、多面板克利夫兰点图(dotplot)
数据:同上
要求:在区域(area)是OS的子集里画出SAL的月度(Month)点图(按不同的station)
jpeg("tu3.jpg")dotplot(factor(Month)~SAL|Station,subset=Area=="OS",col=1,data=z,cex=0.5,xlab="salinty",ylab="month")dev.off()
注意:subset表示取子集
&4、多面板直方图(histogram)
数据:同上
要求:对不同的station画SAL的直方图
jpeg("tu4.jpg")histogram(~SAL|Station,data=z,subset=(Area=="OS"),layout=c(1,4),nint=30,xlab="salinity",ylab="frequecies")dev.off()
注意:nint是指条形的个数,在这里如果不加会使得条形数偏少,所以把条形增加到30个。如果在代码中加上strip=FALSE(消去带状标签)和strip.left=TRUE就表示把带状标签移到左边
5、三维散点图、表面图和等高线图
对于绘制三个变量的图形,一般使用cloud,levelplot,和wire frame函数
数据:同上
要求:画出CHLFA、T、SAL按不同station的三维散点图
cloud(CHLFa~T*SAL|Station,data=z,screen=list(z=105,x=-70),xlab="T",ylab="sal",zlab="chl",ylim=c(26,33),subset=(Area=="OS"),scales=list(arrows=FALSE))
注意:screen指出相应坐标轴的旋转度数,arrows=FALSE表示我们移除了一般三维图形中绘于坐标轴旁边用来指示坐标正方向的箭头。这样坐标轴就有了刻度。
阅读(7821)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'R语言学习之十',
blogAbstract:'lattice包是一个非常强大地高级绘图程序包,由Deepayan Sarkar编写,这个程序包使20世纪90年代初期在贝尔实验室发展起来的特雷里斯图形框架(Trellis)变成了现实。它可以将数据子集的图像显示在一个单独的面板上。
高级格函数
下面用一个表格把常用的高级函数表示出来
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:2,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}后使用快捷导航没有帐号?
查看: 2265|回复: 0
使用R绘制几种常用的双坐标轴图形
注册会员, 积分 80, 距离下一级还需 120 积分
论坛徽章:1
之前公众号推送了一系列关于使用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(''), to = as.Date(''), by = 'month')
Consumers &- c(100,80,120,153,200,188,220,322,300,321,282,304)
Amount &- c(8,00,00,71)
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()
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语言中,怎么调节坐标刻度数字与坐标轴的距离
世嘉WCLANFK
许多R 的高级图形自身就含有坐标轴,此外你可以用低级图形函数axis() 设置你自己的坐标轴.坐标轴主要包括三个部分:轴线(axis line)(线条格式由图形参数lty控制),刻度(tick mark)(划分轴线上的刻度) 和刻度标记(tick label)(标记刻度上的单位).这些部分可以通过下面的图形参数设置.lab=c(5, 7, 12) 前两个参数分别是x 和y 轴期望的刻度间隔数目.第三个参数刻度标记的字符长度(包括小数点).这个参数设的太小会导致所有的标记变成一样的数字.las=1 刻度标记的方向.0 表示总是平行于坐标轴,1 表示总是水平,以及2 表示总是垂直于坐标轴.mgp=c(3, 1, 0) 三个坐标成分的位置.第一个参数是轴标签相对轴位置的距离,以文本行作为参照单位的.第二个参数表示刻度标记的距离,最后一个参数是轴位置到轴线的距离(常常是0).正值表示在图形外,负值表示在图形内.tck=0.01 刻度的长度,以画图区域大小的比率作为度量.当tck 比较小(小于0.5),x 和y 轴上的刻度强制大小一致.值为1时,给出网格线.负值时刻度在图形外.tck=0.01 和mgp=c(1,-1.5,0)表示内部刻度.xaxs="r"yaxs="i" 分别设定x 和y 轴的形式."i" (内在的) 和"r" (默认) 形式的刻度都适合数据的范围,但是"r" 形式的刻度会在刻度范围两边留一些空隙(S 还有一些在R 里面没有实现的刻度形式).
为您推荐:
其他类似问题
扫描下载二维码

我要回帖

更多关于 r语言 极坐标 的文章

 

随机推荐