R擅长绘图,使用R可以绘制各种类型图。今天将以示例的形式来讲解如何绘制一些常见基本图,包括:
线形图
条形图
直方图
饼图
点图
箱图
一维图
1. 线形图
首先,我们将使用car
向量中的值生成一个非常简单的图形:
# 定义具有5个值的cars向量
cars <- c(1, 3, 6, 4, 9)
# 用plot()函数(使用默认参数值)绘制cars向量
plot(cars)
我们添加一个标题、用线连接这些点、改变颜色:
# 使用线条连接蓝点来绘制`car`向量
plot(cars, type="o", col="blue")
# 用红色、粗体/斜体字体来创建标题
title(main="Autos", col.main="red", font.main=4)
现在,我们为trucks
向量添加一条红线,并直接指定y
轴范围,使得y
轴适应trucks
数据:
# 定义两个向量
cars <- c(1, 3, 6, 4, 9)
trucks <- c(2, 5, 4, 5, 12)
# 使用从0到12的y轴绘制数据
plot(cars, type="o", col="blue", ylim=c(0,12))
# 用红色的虚线和正方形的点来绘制卡车数据
lines(trucks, type="o", pch=22, lty=2, col="red")
# 用红色、粗体/斜体字体来创建标题
title(main="Autos", col.main="red", font.main=4)
接下来,让我们更改坐标轴的标签,来匹配我们的数据并添加图例。我们还将使用range()
函数计算y
轴的范围,以便对数据的任何更改都将自动反映在图形中。
# 定义两个向量
cars <- c(1, 3, 6, 4, 9)
trucks <- c(2, 5, 4, 5, 12)
# 计算y轴范围
g_range <- range(0, cars, trucks)
# 将y轴的范围自动设置到从0到汽车和卡车向量的最大值
# 关闭轴和注释(轴标签),以便我们可以自己指定它们
plot(cars, type="o", col="blue", ylim=g_range,
axes=FALSE, ann=FALSE)
# 使用周一至周五标签标记x轴
axis(1, at=1:5, lab=c("Mon","Tue","Wed","Thu","Fri"))
# 使用水平标签,并且y轴每4个标记显示一个刻度
# 4*0:g_range[2] 等价于 c(0,4,8,12)
axis(2, las=1, at=4*0:g_range[2])
# 创建一个方框包围图
box()
# 用红色的虚线和正方形的点来绘制卡车数据
lines(trucks, type="o", pch=22, lty=2, col="red")
# 用红色、粗体/斜体字体来创建标题
title(main="Autos", col.main="red", font.main=4)
# 用深绿色文字标记x和y轴
title(xlab="Days", col.lab=rgb(0,0.5,0))
title(ylab="Total", col.lab=rgb(0,0.5,0))
# 在(1, g_range [2]) 处创建一个图例,通过cex(默认值为 1)设置图例大小
# 并使用与实际绘图相同的线条颜色和点来绘制图例
legend(1, g_range[2], c("cars","trucks"), cex=0.8,
col=c("blue","red"), pch=21:22, lty=1:2)
现在,让我们直接从制表符分隔文件(autos.txt
)读取绘图数据。 该文件中的内容如下图:
该文件包含另一个suvs
向量数据,我们将绘制的图片文件保存在C:/ R
目录下(你们也可以根据需要保持到其它位置)。
我们还将使用一个向量来存储要在图形中使用的颜色,这样的话,如果我们以后要更改颜色,则只需要修改一个地方就行。最后,我们将图保存为PNG
文件。
# 从autos.txt文件中读取各种汽车数据
autos_data <- read.table("C:/R/autos.txt", header=T, sep="\t")
# 计算数据中的最大值,确定y轴范围 (或者我们也可以使用range函数来确定范围)
max_y <- max(autos_data)
# 定义用于小汽车,卡车,越野车的颜色
plot_colors <- c("blue","red","forestgreen")
# 启动PNG设备将绘制的图保存到figure.png中
png(filename="C:/R/figure.png", height=400, width=600, bg="white")
# 将y轴的范围自动设置到从0到最大值max_y
# 关闭轴和注释(轴标签),以便我们可以自己指定它们
plot(autos_data$cars, type="o", col=plot_colors[1],
ylim=c(0,max_y), axes=FALSE, ann=FALSE)
# 使用周一至周五标签标记x轴
axis(1, at=1:5, lab=c("Mon", "Tue", "Wed", "Thu", "Fri"))
# 使用水平标签,并且y轴每4个标记显示一个刻度
# 4*0:max_y 等价于 c(0,4,8,12)
axis(2, las=1, at=4*0:max_y)
# 创建一个方框包围图
box()
# 用红色的虚线和正方形的点来绘制卡车数据
lines(trucks, type="o", pch=22, lty=2, col="red")
# 用绿色虚线和菱形点绘制suvs数据
lines(autos_data$suvs, type="o", pch=23, lty=3,
col=plot_colors[3])
# 用红色、粗体/斜体字体来创建标题
title(main="Autos", col.main="red", font.main=4)
# 用深绿色文字标记x和y轴
title(xlab= "Days", col.lab=rgb(0,0.5,0))
title(ylab= "Total", col.lab=rgb(0,0.5,0))
# 在(1, max_y) 处创建一个图例,通过cex(默认值为 1)设置图例大小
# 并使用与实际绘图相同的线条颜色和点来绘制图例
legend(1, max_y, names(autos_data), cex=0.8, col=plot_colors,
pch=21:23, lty=1:3);
# 关闭设备驱动程序(将绘图保存为png文件)
dev.off()
保存的图片figure.png为:
在下一个示例中,我们将绘制的图片保存为PDF
,并在图形周围切掉多余的空白; 这在LaTeX中使用图形时非常有用。我们还将增加线宽,缩小轴字体大小,并将x
轴标签倾斜45
度。
# 从文件autos.txt中读取各种汽车数据
autos_data <- read.table("C:/R/autos.txt", header=T, sep="\t")
# 定义用于小汽车,卡车,越野车的颜色
plot_colors <- c(rgb(r=0.0,g=0.0,b=0.9), "red", "forestgreen")
# 启动PDF设备将绘制的图保存到figure.pdf中
pdf(file="C:/R/figure.pdf", height=3.5, width=5)
# 修剪多余的空白(底部、左侧、顶部、右侧)
par(mar=c(4.2, 3.8, 0.2, 0.2))
# 使用range函数将y轴的范围自动设置到从最小值到最大值之间
# 关闭轴和注释(轴标签),以便我们可以自己指定它们
# 用较小的字体标记轴并使用较大的线宽
plot(autos_data$cars, type="l", col=plot_colors[1],
ylim=range(autos_data), axes=F, ann=T, xlab="Days",
ylab="Total", cex.lab=0.8, lwd=2)
# 使x轴刻度线不带标签
axis(1, lab=F)
# 以45度在默认刻度线绘制自定义的x轴标签
text(axTicks(1), par("usr")[3] - 2, srt=45, adj=1,
labels=c("Mon", "Tue", "Wed", "Thu", "Fri"),
xpd=T, cex=0.8)
# 用较小的水平标签绘制y轴
axis(2, las=1, cex.axis=0.8)
# 创建一个方框包围图
box()
# 用红色虚线绘制卡车数据
lines(autos_data$trucks, type="l", lty=2, lwd=2,
col=plot_colors[2])
# 用较粗的绿色虚线绘制越野车数据
lines(autos_data$suvs, type="l", lty=3, lwd=2,
col=plot_colors[3])
# 在左上角创建一个图例,该图例稍小并且没有边框
legend("topleft", names(autos_data), cex=0.8,
col=plot_colors, lty=1:3, lwd=2, bty="n")
# 关闭设备驱动程序(将绘图保存为pdf文件)
dev.off()
# 将边距参数恢复到默认值
par(mar=c(5, 4, 4, 2) + 0.1)
保存的PDF文件为:
2. 条形图
让我们从绘制cars
向量的简单条形图开始:
# 定义具有5个值的cars向量
cars <- c(1, 3, 6, 4, 9)
# 绘制条形图
barplot(cars)
现在,让我们从autos.txt
数据文件中读取cars
数据,添加标签,并将条形框配上蓝色边框和密度线:
# 从文件中读取数据
autos_data <- read.table("C:/R/autos.txt", header=T, sep="\t")
# 使用指定的轴标签绘制cars数据
# 使用蓝色边框和对角线
barplot(autos_data$cars, main="Cars", xlab="Days",
ylab="Total", names.arg=c("Mon","Tue","Wed","Thu","Fri"),
border="blue", density=c(10,20,30,40,50))
现在让我们用一些颜色画出每天各汽车情况,并显示一个图例:
# 使用彩虹色自动绘制带有相邻条的图
barplot(as.matrix(autos_data), main="Autos", ylab= "Total",
beside=TRUE, col=rainbow(5))
# 将图例放置在左上角,使用彩虹色且无边框
legend("topleft", c("Mon","Tue","Wed","Thu","Fri"), cex=0.6,
bty="n", fill=rainbow(5))
让我们使用堆积的条形图绘制每天的汽车总数,并将图例放在绘图区域之外:
# 读取数据
autos_data <- read.table("C:/R/autos.txt", header=T, sep="\t")
# 扩展绘图区域右侧的空间,为图例腾出空间
par(xpd=T, mar=par()$mar+c(0,0,0,4))
# 使用热度颜色自动绘制图形(转置矩阵)
# 在每个条之间留出10%的空间,并给标签
barplot(t(autos_data), main="Autos", ylab="Total",
col=heat.colors(3), space=0.1, cex.axis=0.8, las=1,
names.arg=c("Mon","Tue","Wed","Thu","Fri"), cex=0.8)
# 使用热度颜色,并将图例放置在(6,30)处
legend(6, 30, names(autos_data), cex=0.8, fill=heat.colors(3));
# 将边距参数恢复到默认值
par(mar=c(5, 4, 4, 2) + 0.1)
3. 直方图
先看个简单的示例:
# 定义suvs变量
suvs <- c(4, 4, 6, 6, 16)
# 绘制直方图
hist(suvs)
现在,让我们从autos.txt
数据文件中读取汽车数据,并以浅蓝色绘制汽车、卡车和越野车组合数据的直方图:
# 从文件读取数据
autos_data <- read.table("C:/R/autos.txt", header=T, sep="\t")
# 把这三个向量连接起来
autos <- c(autos_data$cars, autos_data$trucks,
autos_data$suvs)
# 用浅蓝色绘制直方图,y轴的范围为0到10
hist(autos, col="lightblue", ylim=c(0,10))
现在更改分组大小,以使所有值都不会分组在一起,并使y轴标签水平。
# 读取数据
autos_data <- read.table("C:/R/autos.txt", header=T, sep="\t")
# 把这三个向量连接起来
autos <- c(autos_data$cars, autos_data$trucks,
autos_data$suvs)
# 计算数据的最大y值
max_num <- max(autos)
# 使用火焰颜色
# 设置分组大小使得所有值都不会分组到一起
# 使x轴范围从0到最大值
# 不考虑间隔的右边界
# 设置标题
# 使y轴标签水平
hist(autos, col=heat.colors(max_num), breaks=max_num,
xlim=c(0,max_num), right=F, main="Autos Histogram", las=1)
现在让我们创建大小不一样的分组并绘制概率密度直方图。
# 创建不同大小的分组间隔
brk <- c(0,3,4,5,6,10,16)
# 使用breaks参数,将频数改为概率密度
hist(autos, col=heat.colors(length(brk)), breaks=brk,
xlim=c(0,max_num), right=F, main="Probability Density",
las=1, cex.axis=0.8, freq=F)
在下示例中,我们将绘制1000
个具有对数正态分布的随机值的分布直方图:
# 生成1000个随机数
r <- rlnorm(1000)
hist(r)
对数正态分布通常在双对数轴上看起来更好,并且让我们使用带点的图来显示分布。
# 生成1000个随机数
r <- rlnorm(1000)
# 获取分布但不绘制直方图
h <- hist(r, plot=F, breaks=c(seq(0,max(r)+1, .1)))
# 使用双对数轴绘制直方图,并用蓝色点
plot(h$counts, log="xy", pch=20, col="blue",
main="Log-normal distribution",
xlab="Value", ylab="Frequency")
4. 饼图
先看个简单例子:
# 使用cars数据
cars <- c(1, 3, 6, 4, 9)
# 绘制饼图
pie(cars)
现在让我们添加标题,更改颜色并定义我们自己的标签:
cars <- c(1, 3, 6, 4, 9)
# 自定义标题、颜色和标签
pie(cars, main="Cars", col=rainbow(length(cars)),
labels=c("Mon","Tue","Wed","Thu","Fri"))
现在让我们更改颜色,使用百分比标记并创建图例:
cars <- c(1, 3, 6, 4, 9)
# 定义一些适合黑白打印的颜色
colors <- c("white","grey70","grey90","grey50","black")
# 计算每天的百分比,四舍五入到小数点后一位
car_labels <- round(cars/sum(cars) * 100, 1)
# 在每个值之后连接一个'%'字符
car_labels <- paste(car_labels, "%", sep="")
# 自定义标题、自定义颜色和标签的饼图
pie(cars, main="Cars", col=colors, labels=car_labels,
cex=0.8)
# 在右侧创建图例
legend(1.5, 0.5, c("Mon","Tue","Wed","Thu","Fri"), cex=0.8,
fill=colors)
5. 点图
先来个简单的点图:
# 读取数据
autos_data <- read.table("C:/R/autos.txt", header=T, sep="\t")
# 绘制点图
dotchart(t(autos_data))
让我们使点图更加丰富多彩:
# 使用小点,彩色点图
dotchart(t(autos_data), color=c("red","blue","darkgreen"),
main="Dotchart for Autos", cex=0.8)
6. 箱图
先来个简单的例子:
cars <- c(1, 3, 6, 4, 9)
# 绘制箱图
boxplot(cars)
绘制水平箱形,添加标题、标签,更改颜色:
boxplot(cars,
main='Autos',
xlab='cars',
col='red',
horizontal=TRUE)
绘制多个箱图:
# 生成一个随机数据框
data <- data.frame(x=rnorm(1000),
y=rnorm(1000,1),
z=rnorm(1000,2))
# 绘制箱图
boxplot(data,
ylab='value',
col=c('red', 'blue', 'green'))
7. 一维图
来看两个例子:
# 生成100个正态分布随机数
x <- rnorm(100)
# 绘制一维图
stripchart(x)
使点移动,以便它们之间有更大的间隔,并在垂直方向上绘制。
# 生成100个正态分布随机数
x <- rnorm(100)
# 为了避免重叠,设置间隔;更改颜色,在垂直方向上绘制
stripchart(x, method="jitter", col='red', vertical=TRUE)
8. 其它
此示例显示了所有26
种可用于绘图的点形状:
# 先制作一个空图
plot(1, 1, xlim=c(1,5.5), ylim=c(0,7), type="n", ann=FALSE)
# 随着大小的增加而绘制数字0到4,并设置颜色
text(1:5, rep(6,5), labels=c(0:4), cex=1:5, col=1:5)
# 随着大小的增加而绘制点形状0到4,并设置颜色,添加标签
points(1:5, rep(5,5), cex=1:5, col=1:5, pch=0:4)
text((1:5)+0.4, rep(5,5), cex=0.6, (0:4))
# 点形状5到9,并添加标签
points(1:5, rep(4,5), cex=2, pch=(5:9))
text((1:5)+0.4, rep(4,5), cex=0.6, (5:9))
# 点形状10到14,并添加标签
points(1:5, rep(3,5), cex=2, pch=(10:14))
text((1:5)+0.4, rep(3,5), cex=0.6, (10:14))
# 点形状15到19,并添加标签
points(1:5, rep(2,5), cex=2, pch=(15:19))
text((1:5)+0.4, rep(2,5), cex=0.6, (15:19))
# 点形状20到25,并添加标签
points((1:6)*0.8+0.2, rep(1,6), cex=2, pch=(20:25))
text((1:6)*0.8+0.5, rep(1,6), cex=0.6, (20:25))
以上内容主要参考:https://sites.harding.edu/fmccown/r/
今天关于R基本绘图就介绍到这,希望对大家有点帮助。