画图例子
R Graph Cookbook例子
- <span style="font-size:18px;"></span>
- <span style="font-size:18px;">From:</span><a href="http://www.dataguru.cn/article-1766-1.html"><span style="font-size:18px;">http://www.dataguru.cn/article-1766-1.html</span></a>
今天突然找到一本专门教授R语言绘图的书,R Graph Cookbook,发现还不错。当初喜欢上R语言就是因为它绘图特别好看。下面把这本书的内容,经过我学习后,翻译并贴上了吧。(我水平还不够,原创还不行呀,不过学习就是先模仿再创新的过程)之所以要贴到博客上来,我是怕有一天我也忘记了,好直接到我博客上来搜索一下,同时也方便了别人。
下面说的是用R语言绘制散点图。其实绘制散点图,用plot(x,y)直接就可以了,不过这样绘制出来的散点图太简单了,不能达到使用的要求,所以要详细得设置一些参数,才能让图形更加的漂亮。
还是直接上代码吧,我已经做好注释的了。
- <span style="font-size:18px;">plot(cars$dist~cars$speed,#y~x,cars是R自带的数据
- main="Relationship between car distance & speed",#标题
- xlab = "Speed(miles per hour)",#x轴标题
- ylab = "Distance travelled (miles)",#Y轴标题
- xlim = c(0,30),#设置x轴的取值区间为0到30
- ylim = c(0,140),#设置y轴的取值区间为0到140
- xaxs = "i",#这里是设置x轴的风格,暂时没看明白有多大区别
- yaxs = "i",
- col = "red",#设置颜色
- pch = 19)#pch指代点的形状,用数字表示,可查看帮助文档
- #如果要保存图片怎么办呢?我觉得最简单的方法就是使用RStudio这个IDE,极其得好,可惜很多人都不知道。#如果你不会,可以用如下代码实现:#(图形的参数还有很多个,我这里只使用了其中的几个)
- png(filename="散点图.png",width=480,height=480)
- plot(cars$dist~cars$speed,#y~x
- main="Relationship between car distance & speed",#标题
- xlab = "Speed(miles per hour)",#x轴标题
- ylab = "Distance travelled (miles)",#Y轴标题
- xlim = c(0,30),#设置x轴的取值区间为0到30
- ylim = c(0,140),#设置y轴的取值区间为0到140
- xaxs = "i",#这里是设置x轴的风格,暂时没看明白有多大区别
- yaxs = "i",
- col = "red",
- pch = 19)#pch指代点的形状,用数字表示,可查看帮助文档
- dev.off()
- </span>
- <span style="font-size:18px;">png(filename="散点图.png",width=480,height=480)
- plot(cars$dist~cars$speed,#y~x
- main="Relationship between car distance & speed",#标题
- xlab = "Speed(miles per hour)",#x轴标题
- ylab = "Distance travelled (miles)",#Y轴标题
- xlim = c(0,30),#设置x轴的取值区间为0到30
- ylim = c(0,140),#设置y轴的取值区间为0到140
- xaxs = "i",#这里是设置x轴的风格,暂时没看明白有多大区别
- yaxs = "i",
- col = "red",
- pch = 3)#pch指代点的形状,用数字表示,可查看帮助文档
- points(cars$speed~cars$dist,pch=19)#因为比较难弄数据,就把原先的数据因果关系颠倒一下,pch设置与前面不同以区分
- dev.off()</span>
如果自己没有数据的话,可以用data()查看R语言内置的数据的哦。还是有挺多数据的。
上面的这些是散点图,但是你只要在参数里面type="l"#是字母l,那么就会将这些点串联起来画成线了。
下面是条形图的绘制方法(bar plot),数据是该书自带的,代码如下:
- <span style="font-size:18px;">png(filename="散点图.png",width=480,height=480)
- Sales <- read.csv("/home/rickey/文档/电子书/R教程/Learn R statistics/R Graph/Code/Chapter 1/Data Files/citysales.csv",header=TRUE)#header设置为TRUE表示把数据行和列的名称也读取进来
- barplot(Sales$ProductA,
- names.arg=Sales$City,
- col="blue")
- dev.off()</span>
图形输出(pdf\Win\PBG\JPEG\BMP\PostScript)
用代码保存图形,将绘图语句夹在开启目标图形设备的语句和关闭目标图形设备的语句之间即可。
- <span style="font-size:18px;">#pdf("mygraph.pdf")#pdf文件
- win.metafile("filename.wmf")#windows图形文件
- #png("filename.png")#PBG文件
- #jpeg("filename.jpg")#JPEG文件
- #bmp("filename.bmp")#BMP文件
- #postscript("filename.ps")#PostScript文件
- attach(mtcars)
- plot(wt,mpg)
- abline(lm(mpg~wt))
- title("Regression of MPG on Weight")
- detach(mtcars)
- dev.off()
- </span>
图形初阶
使用图形
- <span style="font-size:18px;">dose=c(20,30,40,45,60)
- drugA=c(16,20,27,40,60)
- drugB=c(15,18,25,31,40)
- plot(dose,drugA,type="b")</span>
5.图形参数
- <span style="font-size:18px;">dose=c(20,30,40,45,60)
- drugA=c(16,20,27,40,60)
- drugB=c(15,18,25,31,40)
- plot(dose,drugA,type="b")
- opar = par(no.readonly=TRUE) #复制一份单签的图形参数
- par(lty=2,pch=17) #将默认的线性类型修改为虚线(lty=2)并且将默认的点符号改为了实心三角(pch=17)
- #也可以使用par(lty=2);par(pch=17)两句
- plot(dose,drugA,type="b")#绘制了图形
- par(opar)#还原了原始设置
- #或者这样写plot(dose,drugA,type="b",lty=2,pch=17)来画图,但只是针对于这张图
- </span>
pch :指定绘制点时使用的符号
cex:指定符号的大小。cex是一个数值,表示绘图符号相对于默认值大小的缩放倍数。默认大小为1,1.5表示放大为默认值的1.5倍.
lty:指定线条类型
lwd:指定线条宽度。(默认值的几倍)
col:默认的绘图颜色。如这是col=c("red","blue")并需要绘制三条线,第一条为红色,第二条为蓝色,第三条为红色
col.axis 坐标轴颜色
col.main 标题颜色
col.sub 副标题的颜色
fg 前景色
bg 背景色
example: col=1,col="white" col="#FFFFFF" col=rgb(1,1,1) col=hsv(0,1,1) 都可以表示白色
R中也用多种用于创建连续型颜色向量的函数:
rainbow()
heat.colors()
terrain.colors()
top.colors()
cm.colors()
gray()可以生成多节灰度
- <span style="font-size:18px;">n=10
- mycolors=rainbow(n)
- pie(rep(1,n),labels=mycolors,col=mycolors)
- mygrays=gray(0:n/n)
- pie(rep(1,n),labels=mygrays,col=mygrays)</span>
6.文本属性
cex:表示相对默认大小缩放倍数的数值。(倍数)
cex.axis:坐标轴刻度文字的缩放倍数。
cex.lab:坐标轴标签(名称)的缩放倍数。
cex.main:标题的缩放倍数
cex.sub:副标题的缩放倍数
font: 整数类型。1=常规,2=粗体,3=斜体,4=粗斜体,5=符号字体(adobe编码)
font.axis font.lab font.main font.sub
ps 磅值文本最终的大小为ps*cex
family 绘制文本是使用的字体族。 标准取值为serif(衬线)、sans(无衬线)和mono(等宽)
Windows中,可以通过函数windowsFont()创造新的映射。(Mac,采用quartzFont())
PDF或者PostScript输出格式图形,修改相对简单。
PDF使用names(pdfFonts())找出系统有哪些字体可用,然后用pdf(file=”myplot.pdf“,family="fontname")生成图形。
PostScript输出格式的图形,可以使用names(postscriptFonts())和postscript(file="myplot.ps",family="fontname")
7.图形尺寸和边界尺寸
pin:以英寸表示的图形尺寸(宽和高)
mai:以数值向量表示的边界大小,顺序为“下、左、上、右”单位为英寸
mar:以数值向量表示的边界大小,顺序为“下、左、上、右”单位为英分。默认=c(5,4,4,2)+0.1
8.添加文本、自定义坐标和图例
- <span style="font-size:18px;">dose=c(20,30,40,45,60)
- drugA=c(16,20,27,40,60)
- drugB=c(15,18,25,31,40)
- plot(dose,drugA,type="b",col="red",lty=2,pch=2,lwd=2,main="Clinical Trails for Drug A",sub="This is hypothetical data",xlab="Dosage",ylab="Drug Respponse",xlim=c(0,60),ylim=c(0,70))</span>
某些高级绘图函数已经包含了默认的标题和标签。可以通过plot()语句货单独的par()语句中添加ann=FALSE来移除他们
标题
可以使用title()函数为图形添加标题和坐标轴标签。
坐标轴
side:一个整数,表示图形的那边会画坐标(1,2,3,4对应下、左、上、右)
at: 一个数值型向量,表示需要绘制刻度线的位置
labels:一个字符型向量,表示至于刻度线旁边的文字表全(如果是NULL,直接使用at中的值)
pos:坐标轴线位置的坐标
lty:线条类型
col:线条的刻度线颜色
las:标签是否平行于(=0)或垂直于(=2)坐标轴
tck:刻度线的长度,以向对于绘图区域大小的分数表示(负数表示在图形外侧,整数表示在图形内侧)
Hmisc包中的minor.tick()函数 用来创建次要刻度线。
tick.ratio表示次要刻度线相对于主刻度线的大小比例。当前主刻度线长度可以用par("tck")获取。
参考线
函数abline()可以用来为图形添加参考线。abline(h=yvalues,v=xvalues)
example:abline(v=seq(1,10,2),lty=2,col="blue")
图例
用legend(location,title,legend,..)添加图例
location:可以直接给定xy值;location(1)通过鼠标单击给出图例的位置;关键字:bottom、bottomleft、left、topleft、topright、right、bottomright、center,同时使用参数inset=指定图形想图形内侧移动的大小(以绘图大小的分数表示)
title:图例标题的字符串(选)
legend:图例标签组成的字符型向量
文本标注
text(location,“”,pos...)
mtext(“”,side,line=n...)
location:可以直接给定xy值;location(1)通过鼠标单击给出图例的位置
pose:整数,文本相对位置的方向参数。如果指定参数offset=,,作为偏移量,以相对于单个字符宽度的比例表示
side:整数,指定用来放置文本的边。
par()增大字号
plotmath()数学标注
- <span style="font-size:18px;">attach(mtcars)
- plot(wt,mpg,main="Mileage vs Car Weight",xlab="Weight",ylab="Mileage",pch=18,col="blue")
- text(wt,mpg,row.names(mtcars),cex=0.6,pos=4,col="red")
- detach(mtcars)</span>
- <span style="font-size:18px;">opar=par(no.readonly=TRUE)
- par(cex=1.5)
- plot(1:7,1:7,type="n")
- text(3,3,"Example of default text")
- text(4,4,family="mono","Example of mono-spaced text")
- text(5.5,family="serif","Example of serif text")
- par(opar)</span>
图形有问题
图形组合
在R中使用函数par()或layout()可以容易地组合多幅图形为一幅图形。par()函数中使用图形参数mfrow=c(nrows,ncols)来穿件按行填充的、行数为nrows、列数为ncols的图形矩阵。另外,可以使用nfcols=c(nrows,ncols)按列填充矩阵。
- <span style="font-size:18px;">attach(mtcars)
- opar=par(no.readonly=TRUE)
- par(mfrow=c(3,1))
- hist(wt)
- hist(mpg)
- hist(disp)
- par(opar)
- detach(mtcars)</span>
- <span style="font-size:18px;">attach(mtcars)
- opar= par(no.readonly=TRUE)
- par(mfrow=c(2,2))
- plot(wt,mpg,main="Scatterplot of wt vs. mpg")
- plot(wt,disp,main="Scatterplot of wt vs. disp")
- hist(wt,main="Boxplot of wt")
- boxplot(wt,main="Boxplot of wt")
- par(opar)
- detach(mtcars)</span>
函数layout()的调用形势为layout(mat),其中的mat是一个矩阵,它指定了所要组合的多个图形所在位置。
- attach(mtcars)
- layout(matrix(c(1,1,2,3),2,2,byrow=TRUE))
- hist(wt)
- hist(mpg)
- hist(disp)
- detach(mtcar)
下面代码,将一幅图形放在第一行,两幅图放在第二行,但第一行高度是第二行中图形高度的三分之一,并且,右下角图形宽度是左下角图形宽度的四分之一。
- <span style="font-size:18px;">attach(mtcars)
- layout(matrix(c(1,1,2,3),2,2,byrow=TRUE),widths=c(3,1),heights=c(1,2))
- hist(wt)
- hist(mpg)
- hist(disp)
- detach(mtcars)</span>
图形布局的精细控制
fig=完成这个任务
基本图形
条形图
简单的条形图
vcd包
如果要绘制的类别类型是一个Factor或者是有序性Factor,就可以使用plot()函数快速创建一幅垂直条形图。这时候不用table()函数
(这是关节炎研究,变量Improved记录了对每位接受了安慰剂或药物治疗的病人的治疗效果)
- library(vcd)
- counts=table(Arthritis$Improved)
- counts
- barplot(counts,main="Simple Bar Plot",xlab="Improvement",ylab="Frequency")
- barplot(counts,main="Horizontal Bar Plot",xlab="Frequency",ylab="Improvement",horiz=TRUE)
- library(vcd)
- counts=table(Arthritis$Improved)
- counts
- barplot(counts,main="Simple Bar Plot",xlab="Improvement",ylab="Frequency")
- barplot(counts,main="Horizontal Bar Plot",xlab="Frequency",ylab="Improvement",horiz=TRUE)
堆砌条形图和分组条形图
如果height是一个矩阵而不是一个向量,则绘制结果将是一副堆砌条形图或分组挑衅图。besides=false(默认)->堆砌图 or not 分组条形图
- counts=table(Arthritis$Improved,Arthritis$Treatment)
- counts
- # Placebo Treated
- # None 29 13
- # Some 7 7
- # Marked 7 21
- barplot(counts,main="Grouped Bar Plot",xlab="Treatment",ylab="Frequency",col=c("red","yellow","green"),legend=rownames(counts))
- barplot(counts,main="Grouped Bar Plot",xlab="Treatment",ylab="Frequency",col=c("red","yellow","green"),legend=rownames(counts),beside=TRUE)
均值条形图
条形图并不一定要基于计数数据或者频率数据。(均值,中位数,标准差)
- states=data.frame(state.region,state.x77)
- means=aggregate(states$Illiteracy,by=list(state.region),FUN=mean)
- means
- # Group.1 x
- #1 Northeast 1.000000
- #2 South 1.737500
- #3 North Central 0.700000
- #4 West 1.023077
- means=means[order(means$x),]
- means
- # Group.1 x
- #3 North Central 0.700000
- #1 Northeast 1.000000
- #4 West 1.023077
- #2 South 1.737500
- barplot(means$x,names.arg=means$Group.1)
- title("Mean Illiteracy Rate")
中级绘图
散点图
- attach(mtcars)
- plot(wt,mpg,main="Basic Scatter plot of MPG vs Weight",xlab="Car Weight(1bs/1000)",ylab="Miles Per Gallon ",pch=19)
- abline(lm(mpg~wt),col="red",lwd=2,lty=1)
- lines(lowess(wt,mpg),col="blue",lwd=2,lty=2)
- > library(car)
- > scatterplot(mpg~wt|cyl,data=mtcars,lwd=2,main="Scatter Plot of MPG vs. Weight by # Cylinders",xlab="Weight of Car(lbs/1000)",ylab="Miles Per Gallon",legend.plot=TRUE,id.method="identify",labels=row.names(mtcars),boxplots="xy")
散点图矩阵
- pairs(~mpg+disp+drat+wt,data=mtcars,main="Basic Scatter Plot Matrix")
- library(car)
- scatterplotMatrix(~mpg+disp+drat+wt|cyl,data=mtcars,spread=FALSE,diagonal="histogram",main="Scatter Plot Matrix via car Package")
mpg wt disp drat
mpg 1.0000000 -0.8676594 -0.8475514 0.6811719
wt -0.8676594 1.0000000 0.8879799 -0.7124406
disp -0.8475514 0.8879799 1.0000000 -0.7102139
drat 0.6811719 -0.7124406 -0.7102139 1.0000000
- <span style="font-size:18px;"> library(gclus)
- mydata=mtcars[c(1,3,5,6)]
- mydata.corr=abs(cor(mydata))
- mycolors=dmat.color(mydata.corr)
- myorder=order.single(mydata.corr)
- cpairs(mydata,myorder,panel.colors=mycolors,gap=.5,main="Variables Ordered and Colored by Correlation")</span>
- set.seed(1234)
- n=10000
- c1=matrix(rnorm(n,mean=0,sd=.5),ncol=2)
- c2=matrix(rnorm(n,mean=3,sd=2),ncol=2)
- mydata=rbind(c1,c2)
- mydata=as.data.frame(mydata)
- names(mydata)=c("x","y")
- with(mydata,plot(x,y,pch=19,main="Scatter Plot with 10000 Observations"))
- with(mydata,smoothScatter(x,y,main="Scatterplot Colored by Smoothed Densities"))
- KernSmooth 2.23 loaded
- Copyright M. P. Wand 1997-2009
hexbin包中的hexbin() 函数将二元变量的封箱放到六边形单元格中(图形比名称更直观)
- library(hexbin)
- with(mydata,{
- bin=hexbin(x,y,xbins=50)
- plot(bin,main="Hexagonal Binning with 10000 Observations")
- })
IDPmisc包中的iplot()函数也可以通过颜色来展示店的密度(特定点上的数据数目)。
with(mydata,iplot(x,y,main="Image Scatter Plot with Color Indicating Density"))
三维散点图
- <span style="font-size:18px;">library(scatterplot3d)
- attach(mtcars)
- scatterplot3d(wt,disp,mpg,pch=16,highlight.3d=TRUE,type="h",main="Basic 3D Scatter Plot")</span>
- <span style="font-size:18px;">fit=lm(mpg~wt+disp)
- s3d$plane3d(fit)</span>
气泡图
- attach(mtcars)
- r=sqrt(disp/pi)
- symbols(wt,mpg,circle=r,inches=0.30,fg="white",bg="lightblue",main="Bubble Plot with point size proportional to displacement",ylab="Miles Per Gallon",xlab="Weight of Car(lbs/1000)")
- text(wt,mpg,rownames(mtcars),cex=0.6)
- detach(mtcars)
折线图
相关图
> cor(mtcars)
mpg cyl disp hp drat wt qsec vs am
mpg 1.00 -0.85 -0.85 -0.78 0.681 -0.87 0.419 0.66 0.600
cyl -0.85 1.00 0.90 0.83 -0.700 0.78 -0.591 -0.81 -0.523
disp -0.85 0.90 1.00 0.79 -0.710 0.89 -0.434 -0.71 -0.591
hp -0.78 0.83 0.79 1.00 -0.449 0.66 -0.708 -0.72 -0.243
drat 0.68 -0.70 -0.71 -0.45 1.000 -0.71 0.091 0.44 0.713
wt -0.87 0.78 0.89 0.66 -0.712 1.00 -0.175 -0.55 -0.692
qsec 0.42 -0.59 -0.43 -0.71 0.091 -0.17 1.000 0.74 -0.230
vs 0.66 -0.81 -0.71 -0.72 0.440 -0.55 0.745 1.00 0.168
am 0.60 -0.52 -0.59 -0.24 0.713 -0.69 -0.230 0.17 1.000
gear 0.48 -0.49 -0.56 -0.13 0.700 -0.58 -0.213 0.21 0.794
carb -0.55 0.53 0.39 0.75 -0.091 0.43 -0.656 -0.57 0.058
gear carb
mpg 0.48 -0.551
cyl -0.49 0.527
disp -0.56 0.395
hp -0.13 0.750
drat 0.70 -0.091
wt -0.58 0.428
qsec -0.21 -0.656
vs 0.21 -0.570
am 0.79 0.058
gear 1.00 0.274
carb 0.27 1.000
- library(corrgram)
- corrgram(mtcars,order=TRUE,lower.panel=panel.shade,upper.panel=panel.pie,text.panel=panel.txt,main="Correlogram of mtcars intercorrelations")
- corrgram(mtcars,order=TRUE,lower.panel=panel.ellipse,upper.panel=panel.pts,text.panel=panel.txt,diag.panel=panel.minmax,main="Correlogram of mtcars data using scatter plots and ellipses")
- corrgram(mtcars,lower.panel=panel.shade,upper.panel=NULL,text.panel=panel.txt,main="Car Mileage Data(unsorted)")