R语言初级教程(24): 基本绘图

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基本绘图就介绍到这,希望对大家有点帮助。

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

推荐阅读更多精彩内容