R擅長(zhǎng)繪圖,使用R可以繪制各種類型圖。今天將以示例的形式來講解如何繪制一些常見基本圖,包括:
線形圖
條形圖
直方圖
餅圖
點(diǎn)圖
箱圖
一維圖
1. 線形圖
首先,我們將使用car向量中的值生成一個(gè)非常簡(jiǎn)單的圖形:
# 定義具有5個(gè)值的cars向量
cars <- c(1, 3, 6, 4, 9)
# 用plot()函數(shù)(使用默認(rèn)參數(shù)值)繪制cars向量
plot(cars)

我們添加一個(gè)標(biāo)題、用線連接這些點(diǎn)、改變顏色:
# 使用線條連接藍(lán)點(diǎn)來繪制`car`向量
plot(cars, type="o", col="blue")
# 用紅色、粗體/斜體字體來創(chuàng)建標(biāo)題
title(main="Autos", col.main="red", font.main=4)

現(xiàn)在,我們?yōu)?code>trucks向量添加一條紅線,并直接指定y軸范圍,使得y軸適應(yīng)trucks數(shù)據(jù):
# 定義兩個(gè)向量
cars <- c(1, 3, 6, 4, 9)
trucks <- c(2, 5, 4, 5, 12)
# 使用從0到12的y軸繪制數(shù)據(jù)
plot(cars, type="o", col="blue", ylim=c(0,12))
# 用紅色的虛線和正方形的點(diǎn)來繪制卡車數(shù)據(jù)
lines(trucks, type="o", pch=22, lty=2, col="red")
# 用紅色、粗體/斜體字體來創(chuàng)建標(biāo)題
title(main="Autos", col.main="red", font.main=4)

接下來,讓我們更改坐標(biāo)軸的標(biāo)簽,來匹配我們的數(shù)據(jù)并添加圖例。我們還將使用range()函數(shù)計(jì)算y軸的范圍,以便對(duì)數(shù)據(jù)的任何更改都將自動(dòng)反映在圖形中。
# 定義兩個(gè)向量
cars <- c(1, 3, 6, 4, 9)
trucks <- c(2, 5, 4, 5, 12)
# 計(jì)算y軸范圍
g_range <- range(0, cars, trucks)
# 將y軸的范圍自動(dòng)設(shè)置到從0到汽車和卡車向量的最大值
# 關(guān)閉軸和注釋(軸標(biāo)簽),以便我們可以自己指定它們
plot(cars, type="o", col="blue", ylim=g_range,
axes=FALSE, ann=FALSE)
# 使用周一至周五標(biāo)簽標(biāo)記x軸
axis(1, at=1:5, lab=c("Mon","Tue","Wed","Thu","Fri"))
# 使用水平標(biāo)簽,并且y軸每4個(gè)標(biāo)記顯示一個(gè)刻度
# 4*0:g_range[2] 等價(jià)于 c(0,4,8,12)
axis(2, las=1, at=4*0:g_range[2])
# 創(chuàng)建一個(gè)方框包圍圖
box()
# 用紅色的虛線和正方形的點(diǎn)來繪制卡車數(shù)據(jù)
lines(trucks, type="o", pch=22, lty=2, col="red")
# 用紅色、粗體/斜體字體來創(chuàng)建標(biāo)題
title(main="Autos", col.main="red", font.main=4)
# 用深綠色文字標(biāo)記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]) 處創(chuàng)建一個(gè)圖例,通過cex(默認(rèn)值為 1)設(shè)置圖例大小
# 并使用與實(shí)際繪圖相同的線條顏色和點(diǎn)來繪制圖例
legend(1, g_range[2], c("cars","trucks"), cex=0.8,
col=c("blue","red"), pch=21:22, lty=1:2)

現(xiàn)在,讓我們直接從制表符分隔文件(autos.txt)讀取繪圖數(shù)據(jù)。 該文件中的內(nèi)容如下圖:

該文件包含另一個(gè)suvs向量數(shù)據(jù),我們將繪制的圖片文件保存在C:/ R目錄下(你們也可以根據(jù)需要保持到其它位置)。
我們還將使用一個(gè)向量來存儲(chǔ)要在圖形中使用的顏色,這樣的話,如果我們以后要更改顏色,則只需要修改一個(gè)地方就行。最后,我們將圖保存為PNG文件。
# 從autos.txt文件中讀取各種汽車數(shù)據(jù)
autos_data <- read.table("C:/R/autos.txt", header=T, sep="\t")
# 計(jì)算數(shù)據(jù)中的最大值,確定y軸范圍 (或者我們也可以使用range函數(shù)來確定范圍)
max_y <- max(autos_data)
# 定義用于小汽車,卡車,越野車的顏色
plot_colors <- c("blue","red","forestgreen")
# 啟動(dòng)PNG設(shè)備將繪制的圖保存到figure.png中
png(filename="C:/R/figure.png", height=400, width=600, bg="white")
# 將y軸的范圍自動(dòng)設(shè)置到從0到最大值max_y
# 關(guān)閉軸和注釋(軸標(biāo)簽),以便我們可以自己指定它們
plot(autos_data$cars, type="o", col=plot_colors[1],
ylim=c(0,max_y), axes=FALSE, ann=FALSE)
# 使用周一至周五標(biāo)簽標(biāo)記x軸
axis(1, at=1:5, lab=c("Mon", "Tue", "Wed", "Thu", "Fri"))
# 使用水平標(biāo)簽,并且y軸每4個(gè)標(biāo)記顯示一個(gè)刻度
# 4*0:max_y 等價(jià)于 c(0,4,8,12)
axis(2, las=1, at=4*0:max_y)
# 創(chuàng)建一個(gè)方框包圍圖
box()
# 用紅色的虛線和正方形的點(diǎn)來繪制卡車數(shù)據(jù)
lines(trucks, type="o", pch=22, lty=2, col="red")
# 用綠色虛線和菱形點(diǎn)繪制suvs數(shù)據(jù)
lines(autos_data$suvs, type="o", pch=23, lty=3,
col=plot_colors[3])
# 用紅色、粗體/斜體字體來創(chuàng)建標(biāo)題
title(main="Autos", col.main="red", font.main=4)
# 用深綠色文字標(biāo)記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) 處創(chuàng)建一個(gè)圖例,通過cex(默認(rèn)值為 1)設(shè)置圖例大小
# 并使用與實(shí)際繪圖相同的線條顏色和點(diǎn)來繪制圖例
legend(1, max_y, names(autos_data), cex=0.8, col=plot_colors,
pch=21:23, lty=1:3);
# 關(guān)閉設(shè)備驅(qū)動(dòng)程序(將繪圖保存為png文件)
dev.off()
保存的圖片figure.png為:

在下一個(gè)示例中,我們將繪制的圖片保存為PDF,并在圖形周圍切掉多余的空白; 這在LaTeX中使用圖形時(shí)非常有用。我們還將增加線寬,縮小軸字體大小,并將x軸標(biāo)簽傾斜45度。
# 從文件autos.txt中讀取各種汽車數(shù)據(jù)
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")
# 啟動(dòng)PDF設(shè)備將繪制的圖保存到figure.pdf中
pdf(file="C:/R/figure.pdf", height=3.5, width=5)
# 修剪多余的空白(底部、左側(cè)、頂部、右側(cè))
par(mar=c(4.2, 3.8, 0.2, 0.2))
# 使用range函數(shù)將y軸的范圍自動(dòng)設(shè)置到從最小值到最大值之間
# 關(guān)閉軸和注釋(軸標(biāo)簽),以便我們可以自己指定它們
# 用較小的字體標(biāo)記軸并使用較大的線寬
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軸刻度線不帶標(biāo)簽
axis(1, lab=F)
# 以45度在默認(rèn)刻度線繪制自定義的x軸標(biāo)簽
text(axTicks(1), par("usr")[3] - 2, srt=45, adj=1,
labels=c("Mon", "Tue", "Wed", "Thu", "Fri"),
xpd=T, cex=0.8)
# 用較小的水平標(biāo)簽繪制y軸
axis(2, las=1, cex.axis=0.8)
# 創(chuàng)建一個(gè)方框包圍圖
box()
# 用紅色虛線繪制卡車數(shù)據(jù)
lines(autos_data$trucks, type="l", lty=2, lwd=2,
col=plot_colors[2])
# 用較粗的綠色虛線繪制越野車數(shù)據(jù)
lines(autos_data$suvs, type="l", lty=3, lwd=2,
col=plot_colors[3])
# 在左上角創(chuàng)建一個(gè)圖例,該圖例稍小并且沒有邊框
legend("topleft", names(autos_data), cex=0.8,
col=plot_colors, lty=1:3, lwd=2, bty="n")
# 關(guān)閉設(shè)備驅(qū)動(dòng)程序(將繪圖保存為pdf文件)
dev.off()
# 將邊距參數(shù)恢復(fù)到默認(rèn)值
par(mar=c(5, 4, 4, 2) + 0.1)
保存的PDF文件為:

2. 條形圖
讓我們從繪制cars向量的簡(jiǎn)單條形圖開始:
# 定義具有5個(gè)值的cars向量
cars <- c(1, 3, 6, 4, 9)
# 繪制條形圖
barplot(cars)

現(xiàn)在,讓我們從autos.txt數(shù)據(jù)文件中讀取cars數(shù)據(jù),添加標(biāo)簽,并將條形框配上藍(lán)色邊框和密度線:
# 從文件中讀取數(shù)據(jù)
autos_data <- read.table("C:/R/autos.txt", header=T, sep="\t")
# 使用指定的軸標(biāo)簽繪制cars數(shù)據(jù)
# 使用藍(lán)色邊框和對(duì)角線
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))

現(xiàn)在讓我們用一些顏色畫出每天各汽車情況,并顯示一個(gè)圖例:
# 使用彩虹色自動(dòng)繪制帶有相鄰條的圖
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))

讓我們使用堆積的條形圖繪制每天的汽車總數(shù),并將圖例放在繪圖區(qū)域之外:
# 讀取數(shù)據(jù)
autos_data <- read.table("C:/R/autos.txt", header=T, sep="\t")
# 擴(kuò)展繪圖區(qū)域右側(cè)的空間,為圖例騰出空間
par(xpd=T, mar=par()$mar+c(0,0,0,4))
# 使用熱度顏色自動(dòng)繪制圖形(轉(zhuǎn)置矩陣)
# 在每個(gè)條之間留出10%的空間,并給標(biāo)簽
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));
# 將邊距參數(shù)恢復(fù)到默認(rèn)值
par(mar=c(5, 4, 4, 2) + 0.1)

3. 直方圖
先看個(gè)簡(jiǎn)單的示例:
# 定義suvs變量
suvs <- c(4, 4, 6, 6, 16)
# 繪制直方圖
hist(suvs)

現(xiàn)在,讓我們從autos.txt數(shù)據(jù)文件中讀取汽車數(shù)據(jù),并以淺藍(lán)色繪制汽車、卡車和越野車組合數(shù)據(jù)的直方圖:
# 從文件讀取數(shù)據(jù)
autos_data <- read.table("C:/R/autos.txt", header=T, sep="\t")
# 把這三個(gè)向量連接起來
autos <- c(autos_data$cars, autos_data$trucks,
autos_data$suvs)
# 用淺藍(lán)色繪制直方圖,y軸的范圍為0到10
hist(autos, col="lightblue", ylim=c(0,10))

現(xiàn)在更改分組大小,以使所有值都不會(huì)分組在一起,并使y軸標(biāo)簽水平。
# 讀取數(shù)據(jù)
autos_data <- read.table("C:/R/autos.txt", header=T, sep="\t")
# 把這三個(gè)向量連接起來
autos <- c(autos_data$cars, autos_data$trucks,
autos_data$suvs)
# 計(jì)算數(shù)據(jù)的最大y值
max_num <- max(autos)
# 使用火焰顏色
# 設(shè)置分組大小使得所有值都不會(huì)分組到一起
# 使x軸范圍從0到最大值
# 不考慮間隔的右邊界
# 設(shè)置標(biāo)題
# 使y軸標(biāo)簽水平
hist(autos, col=heat.colors(max_num), breaks=max_num,
xlim=c(0,max_num), right=F, main="Autos Histogram", las=1)

現(xiàn)在讓我們創(chuàng)建大小不一樣的分組并繪制概率密度直方圖。
# 創(chuàng)建不同大小的分組間隔
brk <- c(0,3,4,5,6,10,16)
# 使用breaks參數(shù),將頻數(shù)改為概率密度
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個(gè)具有對(duì)數(shù)正態(tài)分布的隨機(jī)值的分布直方圖:
# 生成1000個(gè)隨機(jī)數(shù)
r <- rlnorm(1000)
hist(r)

對(duì)數(shù)正態(tài)分布通常在雙對(duì)數(shù)軸上看起來更好,并且讓我們使用帶點(diǎn)的圖來顯示分布。
# 生成1000個(gè)隨機(jī)數(shù)
r <- rlnorm(1000)
# 獲取分布但不繪制直方圖
h <- hist(r, plot=F, breaks=c(seq(0,max(r)+1, .1)))
# 使用雙對(duì)數(shù)軸繪制直方圖,并用藍(lán)色點(diǎn)
plot(h$counts, log="xy", pch=20, col="blue",
main="Log-normal distribution",
xlab="Value", ylab="Frequency")

4. 餅圖
先看個(gè)簡(jiǎn)單例子:
# 使用cars數(shù)據(jù)
cars <- c(1, 3, 6, 4, 9)
# 繪制餅圖
pie(cars)

現(xiàn)在讓我們添加標(biāo)題,更改顏色并定義我們自己的標(biāo)簽:
cars <- c(1, 3, 6, 4, 9)
# 自定義標(biāo)題、顏色和標(biāo)簽
pie(cars, main="Cars", col=rainbow(length(cars)),
labels=c("Mon","Tue","Wed","Thu","Fri"))

現(xiàn)在讓我們更改顏色,使用百分比標(biāo)記并創(chuàng)建圖例:
cars <- c(1, 3, 6, 4, 9)
# 定義一些適合黑白打印的顏色
colors <- c("white","grey70","grey90","grey50","black")
# 計(jì)算每天的百分比,四舍五入到小數(shù)點(diǎn)后一位
car_labels <- round(cars/sum(cars) * 100, 1)
# 在每個(gè)值之后連接一個(gè)'%'字符
car_labels <- paste(car_labels, "%", sep="")
# 自定義標(biāo)題、自定義顏色和標(biāo)簽的餅圖
pie(cars, main="Cars", col=colors, labels=car_labels,
cex=0.8)
# 在右側(cè)創(chuàng)建圖例
legend(1.5, 0.5, c("Mon","Tue","Wed","Thu","Fri"), cex=0.8,
fill=colors)

5. 點(diǎn)圖
先來個(gè)簡(jiǎn)單的點(diǎn)圖:
# 讀取數(shù)據(jù)
autos_data <- read.table("C:/R/autos.txt", header=T, sep="\t")
# 繪制點(diǎn)圖
dotchart(t(autos_data))

讓我們使點(diǎn)圖更加豐富多彩:
# 使用小點(diǎn),彩色點(diǎn)圖
dotchart(t(autos_data), color=c("red","blue","darkgreen"),
main="Dotchart for Autos", cex=0.8)

6. 箱圖
先來個(gè)簡(jiǎn)單的例子:
cars <- c(1, 3, 6, 4, 9)
# 繪制箱圖
boxplot(cars)

繪制水平箱形,添加標(biāo)題、標(biāo)簽,更改顏色:
boxplot(cars,
main='Autos',
xlab='cars',
col='red',
horizontal=TRUE)

繪制多個(gè)箱圖:
# 生成一個(gè)隨機(jī)數(shù)據(jù)框
data <- data.frame(x=rnorm(1000),
y=rnorm(1000,1),
z=rnorm(1000,2))
# 繪制箱圖
boxplot(data,
ylab='value',
col=c('red', 'blue', 'green'))

7. 一維圖
來看兩個(gè)例子:
# 生成100個(gè)正態(tài)分布隨機(jī)數(shù)
x <- rnorm(100)
# 繪制一維圖
stripchart(x)

使點(diǎn)移動(dòng),以便它們之間有更大的間隔,并在垂直方向上繪制。
# 生成100個(gè)正態(tài)分布隨機(jī)數(shù)
x <- rnorm(100)
# 為了避免重疊,設(shè)置間隔;更改顏色,在垂直方向上繪制
stripchart(x, method="jitter", col='red', vertical=TRUE)

8. 其它
此示例顯示了所有26種可用于繪圖的點(diǎn)形狀:
# 先制作一個(gè)空?qǐng)D
plot(1, 1, xlim=c(1,5.5), ylim=c(0,7), type="n", ann=FALSE)
# 隨著大小的增加而繪制數(shù)字0到4,并設(shè)置顏色
text(1:5, rep(6,5), labels=c(0:4), cex=1:5, col=1:5)
# 隨著大小的增加而繪制點(diǎn)形狀0到4,并設(shè)置顏色,添加標(biāo)簽
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))
# 點(diǎn)形狀5到9,并添加標(biāo)簽
points(1:5, rep(4,5), cex=2, pch=(5:9))
text((1:5)+0.4, rep(4,5), cex=0.6, (5:9))
# 點(diǎn)形狀10到14,并添加標(biāo)簽
points(1:5, rep(3,5), cex=2, pch=(10:14))
text((1:5)+0.4, rep(3,5), cex=0.6, (10:14))
# 點(diǎn)形狀15到19,并添加標(biāo)簽
points(1:5, rep(2,5), cex=2, pch=(15:19))
text((1:5)+0.4, rep(2,5), cex=0.6, (15:19))
# 點(diǎn)形狀20到25,并添加標(biāo)簽
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))

以上內(nèi)容主要參考:https://sites.harding.edu/fmccown/r/
今天關(guān)于R基本繪圖就介紹到這,希望對(duì)大家有點(diǎn)幫助。