优秀的编程知识分享平台

网站首页 > 技术文章 正文

R语言常用图形(r语言绘制图形)

nanyue 2024-08-14 20:32:09 技术文章 8 ℃

R语言最强大的功能之一就是画图。再加上各种各样的R包,比如著名的ggplot2,就可以绘制非常炫目的图形。

1、散点图或线型图函数plot()

x <- rnorm(1000,100,10) #生成1000个均值为100、标准差为10的正态分布随机数
plot(x) #以x的元素值为纵坐标、以序号为横坐标绘图
plot(x,col="red") #col指定散点的颜色,这里绘制红色散点图(默认为黑色)
plot(x,col=c("red","blue"))#绘制红色、蓝色散点图
plot(x,main="标题") #设置标题
plot(x,main="标题",sub="子标题") #设置子标题
plot(x,main="标题",xlab="x轴标签") #设置x轴标签
plot(x,main="标题",ylab="y轴标签") #设置y轴标签
plot(x,ylim=c(60,140)) #设置y轴刻度值
plot(x,xlim=c(60,140)) #设置x轴刻度值
plot(x,asp=0.5) #y/x的比例,y轴数值长度与x轴数值长度的比值
plot(x,cex=5) #cex指定符号的大小(默认值为1)
plot(x,pch=19,cex=2) #pch指定散点的样式(取值1-25,参见pch散点样式图)
plot(x,type="l",lty=2) #lty指定线条类型(取值1-6,参见lty线条类型图)
plot(x,type="p") #type为线型参数(默认为p,参见type线型参数图)
plot(x,fg="green") #fg为前景色
plot(x,bg="green") #fg为背景色
plot(1:26,pch=LETTERS[1:26],col=1:26) #绘制不同颜色大写字母
plot(1:26,pch=letters[1:26],col=1:26) #绘制不同颜色小写字母
#绘制背景色为蓝色的各种符号图案
plot(1:25,pch=1:25,cex=2.5,bg="blue", main="pch符号图",xlab="pch编码")
#绘制背景色为红色的各种符号图案
plot(1:25,pch=1:25,cex=2.5,bg="red", main="pch符号图",xlab="pch编码")
#用$符号绘制图形
plot(1:25,pch="#34;,cex=2,main="pch=#34;)
y <- rnorm(1000,200,50)
plot(x,y) #制作(x,y)散点图
#绘制相关数据散点图和回归直线图
attach(mtcars) #绑定数据框mtcars(R包数据)
plot(wt,mpg)
abline(lm(mpg~wt)) #添加最优拟合曲线
title("Regression of MPG on weight")
detach(mtcars) #对数据框删除绑定
#同时画点和线
dose<-c(20,30,40,45,60)
drugA<-c(16,20,27,40,60)
plot(dose,drugA,type="b")
#同时绘制两条曲线图
x<-c(1:10)
y<-x
z<-10/x
opar<-par(no.readonly=T) #复制当前的图形参数设置
par(mar=c(5,4,4,8)+0.1) #增加边界大小
plot(x,y,type="b",pch=21,yaxt="n",ann=FALSE)
##ann=FALSE是移除默认的标题和标签
lines(x,z,type="b",pch=22,col="red")
axis(2,at=x,labels=x,col.axis="blue",las=2)
##绘制坐标轴
axis(4,at=z,labels=round(z,digits=2),col.axis="green",cex.axis=0.7,las=2,tck=-0.01)
mtext("y=1/x",side=4,line=3,,cex.lab=1,las=2)
##添加标题和文本
title("An Example of Creative Axes",xlab="X",ylab="Y=X")
par(opar) #回复默认设置

2、plot函数其它属性

(1)pch散点样式

(2)lty线条类型

(3)type线型参数

3、颜色设置

(1)预设调色板

R预设调色板系列函数有5个,即:rainbow、heat.colors、terrain.colors、topo.colors、cm.colors。各调色板函数饼图效果如下:

调色板函数饼图代码如下:

n <- 1000
pie(1:n,col=rainbow(n),border=rainbow(n),labels="")
pie(1:n,col=heat.colors(n),border=heat.colors(n),labels="")
pie(1:n,col=terrain.colors(n),border=terrain.colors(n),labels="")
pie(1:n,col=topo.colors(n),border=topo.colors(n),labels="")
pie(1:n,col=cm.colors(n),border=cm.colors(n),labels="")
每个预设调色板有10种颜色,如下图:

这些函数返回的值是向量,完全可以按向量的方式取子集,也可以将不同函数返回的颜色组合起来使用。

#在调色板heat.colors和cm.colors中各取5种颜色,返回10个颜色向量赋值给mycolors
mycolors <- c(heat.colors(10)[c(1,3,5,7,9)], cm.colors(10)[c(2,4,6,8,10)])
#按10种预先颜色绘制柱状图
barplot(1:10,col=mycolors,border=mycolors)
#按10种预先颜色绘制饼图
pie(1:10,col=mycolors,border=mycolors,labels="")
#alpha设置三个(不)透明度颜色向量
mycolor <- rainbow(3,alpha=0.02)
#设置不同三个标准正态分布变量
y1 <- 10+rnorm(10000); y2<- 5+rnorm(10000); y3 <- rnorm(10000)
#绘制散点图(高级绘图)
plot(y1,pch=20,col=mycolor[1],ylim=c(min(y1,y2,y3),max(y1,y2,y3)),xlab="",ylab='',axes=F)
#绘制散点图(低级绘图)
points(y2, pch=20, col=mycolor[2])
points(y3, pch=20, col=mycolor[3])

(2)自定义调色板

如果觉得R预设调色板不合用,可以用colorRampPalette函数自定义调色板。

cl <- colors() #获得调色板颜色向量
head(cl,10) #显示前10个颜色
    [1] "white" "aliceblue" "antiquewhite"
    [4] "antiquewhite1" "antiquewhite2" "antiquewhite3"
    [7] "antiquewhite4" "aquamarine" "aquamarine1"
    [10] "aquamarine2"
length(cl) #共有657个预置颜色名称
		[1] 657
#产生自己的颜色系列
mycolors <- colorRampPalette(c("blue", "orangeRed"))(1000)
#按自定义的颜色系列绘制饼图
pie(1:1000,col=mycolors,border=mycolors,labels="")
mycolors <- colorRampPalette(c("blue","white","darkgreen","yellow","orangered"),bias=1.2)(1000)
pie(rep(1,times=n),col=mycolors,border=mycolors,labels="")

(3)灰度调色板函数

gray函数可以产生不同层次的灰度颜色。hsv函数通过设置色调、饱和度和亮度获得颜色,三个值都是0-1的相对量。用法如下:

mycolors <- gray(0:n/n)
pie(1:1000,col=mycolors,border=mycolors,labels="")

4、饼图函数pie()

饼状图是以不同颜色的圆的切片表示的值。这些切片被标记,并且每个切片对应的数字也在图表中表示。在R中,使用将正数作为向量输入的pie()函数创建饼状图。附加参数用于控制标签,颜色,标题等。

pie()函数特有属性

  • radius - 用来表示饼图圆的半径(-1和+1之间的值)
  • clockwise - 是一个逻辑值,指示片是顺时针还是逆时针绘制
#使用输入向量和标签创建一个简单的饼图
x <- c(11,30,39,20)
pie(x,radius=1,clockwise=T)
lab <- c("70后","80后","90后","00后") #给向量各个元素设标签
png(file = "E:\\R\\img\\birth_of_age.jpg") #建立一个空图像文件
pie(x,labels=lab) #写入图像文件(注意此时不显示)
dev.off() #保存图像文件,写模式结束
#(dev.new()函数打开新的图形窗口)
#饼图标题和颜色
pie(x,labels=lab,main="出生年龄段-饼状图",col=rainbow(length(x)))
#切片百分比和图表图例
piepercent <- paste(round(100*x/sum(x),2),"%")
pie(x,labels=piepercent,main="出生年龄段-饼状图",col=rainbow(length(x)))
legend("topright",lab,cex=0.8,fill=rainbow(length(x)))
#绘制灰度饼图
n<-10
mycolors<-rainbow(n)
pie(rep(1,n),labels=mycolors,col=mycolors)
mygrays<-gray(0:n/n)
pie(rep(1,n),lables=mygrays,col=mygrays)
#3D饼图,如果没有安装软件库plotrix,可先执行install.packages("plotrix")
library("plotrix")
##explode切片距离
pie3D(x,labels=lab,explode=0.1,main="出生年龄段-饼状图")

5、条形图(柱状图)函数

条形图主要用来展示不同分类(横轴)下某个数值型变量(纵轴)的取值。条形图横轴上的数据是离散而非连续的,有时条形图的值表示数值本身,但也有时是表示数据集中的频数。

barplot()函数特有属性

  • horiz - 取值为FALSE为垂直条形图、TRUE为水平条形图,默认为"FALSE"
  • beside - 取值为FALSE为堆叠显示、TRUE为并排显示,为默认方式是堆叠
  • names.arg - 是出现在每个条的向量名称
#创建一个简单的柱状图
H <- c(7,12,28,3,41)
barplot(H)
barplot(H,horiz=TRUE) #绘制水平条形图
#柱状图标签,标题和颜色
M <- c("Mar","Apr","May","Jun","Jul")
barplot(H,names.arg=M,xlab="Month",ylab="Revenue",col="blue",main="Revenue chart",border="red")
#组柱状图和堆叠条形图
colors <- c("green","orange","brown")
months <- c("Mar","Apr","May","Jun","Jul")
regions <- c("East","West","North")
values <- matrix(c(2,9,3,11,9,4,8,7,3,12,5,2,8,10,11),nrow=3,ncol=5,byrow=TRUE)
barplot(values,main="total revenue",names.arg=months,xlab="month",ylab="revenue",col=colors)
##并排显示
barplot(values,main="total revenue",names.arg=months,xlab="month",ylab="revenue",col=colors,beside=TRUE)
legend("topleft", regions, cex=1.3, fill=colors)

6、直方图函数hist()

条形图中间有间隔,多用于分类数据作图;直方图各条中间没有间隔,多用于连续型数据分段作图。

hist()函数特有属性

breaks - 按指定向量给出不同的断点
freq - 取值为FALSE为密度图、TRUE为频数图,默认方式是TRUE
probability - 和freq参数作用相反 labels - 显示在每个柱子上方的标签
#用向量绘制一个简单的直方图
data <- c(rep(1, 10), rep(2, 5), rep(3, 6))
hist(data)
#横坐标按指定向量给出不同的断点绘图
data <- c(rep(1, 10), rep(2, 5), rep(3, 6))
hist(data, breaks = c(0.5, 1.5, 2.5, 3.5))
#freq为TRUE,y轴显示的是每个区间内的频数;为FALSE,显示的是频率(=频数/总数)
op <- par(mfrow = c(1,2)) #设置一页多图(一行两图)
data <- c(rep(1, 10), rep(2, 5), rep(3, 6))
hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), freq = T, main = "freq = T")
hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), freq = F, main = "freq = F")
par(op) #恢复一页一图设置
#显示在每个柱子上方的标签
hist(data,breaks=c(0.5,1.5,2.5,3.5),labels=c("A","B","C"))
#是否显示坐标轴
op <- par(mfrow = c(1,2))
data <- c(rep(1, 10), rep(2, 5), rep(3, 6))
hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), axes = T, main = "axes = T")
hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), axes = F, main = "axes = F")
par(op)
#直方柱着色
op <- par(mfrow = c(1,2))
data <- c(rep(1, 10), rep(2, 5), rep(3, 6))
hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), col = "pink")
hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), col = rainbow(3))
par(op)
#densitty参数用线条填充柱子
op <- par(mfrow = c(1,3))
data <- c(rep(1, 10), rep(2, 5), rep(3, 6))
hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), density = 1, main = "density = 1")
hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), density = 2, main = "density = 2")
hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), density = 3, main = "density = 3")
par(op)
#angle参数用线条填充柱子。angle控制线条的角度,必须和density参数配合使用,才能发挥作用
op <- par(mfrow = c(1,3))
data <- c(rep(1, 10), rep(2, 5), rep(3, 6))
hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), density = 2, angle = 45, main = "angle = 45")
hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), density = 2, angle = 90, main = "angle = 90")
hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), density = 2, angle = 180, main = "angle = 180")
par(op)

7、箱线图函数boxplot()

箱线图(Boxplot)也称箱须图(Box-whisker Plot),是利用数据中的五个统计量:最小值、第一四分位数、中位数、第三四分位数与最大值来描述数据的一种方法。它也可以粗略地看出数据是否具有有对称性,分布的离散程度等信息;特别适用于对几个样本的比较。。

boxplot函数特有属性

  • widh - 控制箱体的宽度,当图中有多个箱子时才会发挥作用
  • varwidth - 控制箱体的宽度,当其值为TRUE时,代表每个箱体的样本量作为其相对宽度。默认为FALSE
  • notch - 其值为TRUE时显示为“细腰”形,默认为FALSE
#用向量绘制一个简单的箱线图
boxplot(1:100)
#用数据框定义绘制多个箱线图
dataset <- data.frame(value=rep(1:100,times=3),group=c("A","B","C"))
boxplot(value~group,dataset)
#用width参数控制箱体的宽度
dataset <- data.frame(value=rep(1:100,times=3),group=c("A","B","C"))
boxplot(value~group,dataset,width=c(1,2,3))
#varwidth参数以每个箱体的样本量作为其相对宽度(times参数元素和等于样本量)
dataset <- data.frame(value=rep(1:100,times=2),group=factor(rep(c("A","B"),times=c(160,40))))
boxplot(value~group,dataset,varwidth=T)
#细腰形箱线图
op <- par(mfrow = c(1, 2))
boxplot(1:100, notch = T, main = "notch = T")
boxplot(1:100, notch = F, main = "notch = F")
par(op)
#箱体着色(背景色)
dataset <- data.frame(value=rep(1:100,times=2),group=factor(rep(c("A","B"),times=c(160,40))))
boxplot(value~ group,dataset,col=c("green","red"))
#箱体线条着色
dataset <- data.frame(value=rep(1:100,times=2),group=factor(rep(c("A","B"),times=c(160,40))))
boxplot(value~group,dataset,border=c("red","green"))
#箱体标签
dataset <- data.frame(value=rep(1:100,times=2),group=factor(rep(c("A","B"),times=c(160,40))))
boxplot(value~group,dataset,names=c("red","green"))

8、R数学函数图形

#正叶线
a <- 2 #随着变量值增加正叶线图形被放大
n <- 4 #n>1,n为奇数时花瓣数为n,n为偶数时花瓣数为2n
r <-seq(from = 0, to = 2*pi, by = 0.004)
x <- a*sin(n*r)*cos(r)
y <- a*sin(n*r)*sin(r)
plot(x,y,cex=0.1,pch=20,xlim=c(-3,3),ylim=c(-2,2))
#李沙如曲线
a <- 16
b <- 17
v <- 1
r <-seq(from = 0, to = 2*pi, by = 0.001)
x <- v*sin(a*r)
y <- v*sin(b*r)
plot(x,y,cex=0.1,pch=20,xlim=c(-2,2),ylim=c(-2,2),col=rainbow(100))
#星茫线
n <- 5 #n为大于1的奇数
a <- 2
r <-seq(from = 0, to = 2*pi, by = 0.001)
x <- a*(cos(r))^n
y <- a*(sin(r))^n
plot(x,y,cex=0.1,pch=20,xlim=c(-3,3),ylim=c(-2,2),col=rainbow(100))

9、R图形集锦

#图形布局,通过令fig=c(x1,x2,y1,y2)来完成图形布局的精细控制
opar<-par(no.readonly=T)
par(fig=c(0,0.8,0,0.8))
plot(mtcars$wt,mtcars$mpg)
par(fig=c(0,0.8,0.38,1),new=T)
boxplot(mtcars$wt,horizontal=T,axes=F)
par(fig=c(0.5,1,0,0.8),new=T)
boxplot(mtcars$mpg,axes=F)
mtext("Enhanced Scatterplot",side=3,outer=T,line=-3)
par(opar)
#根据R包数据mtcars在一页上绘制4个不同参数的直方图
attach(mtcars)
x<-mpg
op <- par(mfrow=c(2,2))
hist(x)
hist(x,breaks = c(10,12.5,15,17.5,20,22.5,25,27.5,30,32.5,35),col="red",xlim=c(10,35))
hist(x,freq=F,breaks=12,col="blue")
rug(jitter(x)) #x轴须图
lines(density(x),col="green",lwd=2)
h<-hist(x,breaks=12,col="red",)
xfit<-seq(min(x),max(x),length=40)
yfit<-dnorm(xfit,mean=mean(x),sd=sd(x))
yfit<-yfit*diff(h$mids[1:2])*length(x)
lines(xfit,yfit,col="blue",lwd=2)
box()
detach(mtcars)
par(op)
#箱线图运用
attach(mtcars)
boxplot(mtcars$mpg) #一个变量的箱线图
boxplot(mpg~cyl,data=mtcars) #二个变量,按cyl对于的mpg值制图
##notch=T #得到含凹槽的箱线图
##varwidth=T #使箱线图的宽度与其样本大小的平方根成正比
boxplot(mpg~cyl,data=mtcars,notch=T,varwidth=T,col="red")
detach(mtcars)
#两个交叉因子的箱线图
attach(mtcars)
mtcars$cyl.f<-factor(mtcars$cyl,levels=c(4,6,8),labels=c("4","6","8"))
mtcars$am.f<-factor(mtcars$am,levels=c(0,1),labels=c("auto","standard"))
boxplot(mpg~am.f*cyl.f,data=mtcars,varwidth=T,col=c("gold","darkgreen"))
detach(mtcars)
#Cleveland点图(逐行逐列累加图)
dotchart(mtcars$mpg,labels=rownames(mtcars),cex=0.7)
##分组、排序、着色后的点图
x<-mtcars[order(mtcars$mpg),]
x$cyl<-factor(x$cyl)
x$color[x$cyl==4]<-"red"
x$color[x$cyl==6]<-"blue"
x$color[x$cyl==8]<-"darkgreen"
dotchart(x$mpg,labels=rownames(x),cex=0.7,groups=x$cyl,gcolor="black",color=x$color,pch=19)
#散点图矩阵
pairs(~mpg+disp+drat+wt,data=mtcars,upper.panel=NULL)
##散点图矩阵 - car包
library(car) #需要预先装载car包
scatterplotMatrix(~mpg+disp+drat+wt|cyl,data=mtcars,spread=F,diagonal="histogram")
#高密度散点图:函数smoothScatter()利用核密度估计生成用颜色密度来表示点分布的散点图
set.seed(123)
n<-1000
c1<-matrix(rnorm(n,0,0.5),ncol=2)
c2<-matrix(rnorm(n,3,2),ncol=2)
mydata<-rbind(c1,c2)
mydata<-as.data.frame(mydata)
names(mydata)<-c("x","y")
with(mydata,plot(x,y,pch=19))
with(mydata,smoothScatter(x,y))
#气泡图
attach(mtcars)
r<-sqrt(disp/pi)
symbols(wt,mpg,r,inches=0.5,fg="white",bg="lightblue")
text(wt,mpg,rownames(mtcars),cex=0.6)
detach(mtcars)
#五种橘树随时间生长的折线图(R包数据Orange为不同编号树的年轮样本)
Orange$Tree<-as.numeric(Orange$Tree)
ntrees<-max(Orange$Tree)
xrange<-range(Orange$age)
yrange<-range(Orange$circumference)
plot(xrange,yrange,type="n")
colors<-rainbow(ntrees)
linetype<-c(1:ntrees)
plotchar<-seq(18,18+ntrees,1)
for(i in 1:ntrees){
    tree<-subset(Orange,Tree==i)
    lines(tree$age,tree$circumference,type="b",lwd=2,lty=linetype[i],col=colors[i],pch=plotchar[i])
}
legend(xrange[1],yrange[2],1:ntrees,cex=0.8,col=colors,pch=plotchar,lty=linetype,title="Tree")
#正态分布检验:判断一样本所代表的背景总体与理论正态分布是否没有显著差异的检验
##画标准正态分布曲线图
norm_expression <- function(x) (1/sqrt(2*pi))*exp(-0.5*x^2) #数据标准化
curve(norm_expression, -4, 4, col="red") #正态分布曲线图
##画样本概率密度和标准正态分布图
norm_expression <- function(x) (1/sqrt(2*pi))*exp(-0.5*x^2)
s <- rnorm(100)
d <- density(s)
s1 <- seq(from=-4, to=4, length.out=100)
plot(d, col="green", ylim=c(0, 0.5))
lines(s1, norm_expression(s1), col="red")
##使用Q-Q图来判断数据是否服从正态分布
s <- rnorm(100)
qqnorm(s)
qqline(s)

在R语言中,有许多不同的图形库和函数,每个库和函数都有其独特的功能和优点。以下是一些常用的图形库:

  • base graphics vs ggplot2:base graphics是R的默认图形库,简单易用,但在美学上有限。ggplot2则是一种基于语法的绘图系统,可创建复杂美观的图形,但语法较复杂。
  • lattice vs ggplot2:lattice是另一种常用的图形库,用于绘制多元数据的图形,与ggplot2相比,lattice的语法更简单,但灵活性较低。
  • plotly vs ggplot2:plotly是一种交互式绘图库,支持在网页上动态显示数据,具有良好的交互性和可视化效果。ggplot2则更适用于静态图形的绘制。
  • ggplot2 vs ggplotly:ggplotly是基于ggplot2的交互式绘图库,可以将ggplot2绘制的图形转换为交互式的网页形式。
  • lattice vs base graphics:lattice可以轻松地绘制多元数据的图形,并具有更高的灵活性,而base graphics则更适用于简单图形的绘制。

R语言中最简单、常用的一个绘图函数就是plot了。plot(参数)一般就能得到我们想要的图。但是,如果想进一步设置其他属性,如标题、x轴名称、y轴名称等,还需要对另外的一些参数做一些了解。

Tags:

最近发表
标签列表