R擅長(zhǎng)繪圖,使用R可以繪制各種類型圖亭畜。今天將以示例的形式來(lái)講解如何繪制一些常見(jiàn)基本圖哥力,包括:
線形圖
條形圖
直方圖
餅圖
點(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)來(lái)繪制`car`向量
plot(cars, type="o", col="blue")
# 用紅色、粗體/斜體字體來(lái)創(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)來(lái)繪制卡車數(shù)據(jù)
lines(trucks, type="o", pch=22, lty=2, col="red")
# 用紅色、粗體/斜體字體來(lái)創(chuàng)建標(biāo)題
title(main="Autos", col.main="red", font.main=4)
接下來(lái)烧给,讓我們更改坐標(biāo)軸的標(biāo)簽燕偶,來(lái)匹配我們的數(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)來(lái)繪制卡車數(shù)據(jù)
lines(trucks, type="o", pch=22, lty=2, col="red")
# 用紅色伯诬、粗體/斜體字體來(lái)創(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è)圖例,通過(guò)cex(默認(rèn)值為 1)設(shè)置圖例大小
# 并使用與實(shí)際繪圖相同的線條顏色和點(diǎn)來(lái)繪制圖例
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è)向量來(lái)存儲(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ù)來(lái)確定范圍)
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)來(lái)繪制卡車數(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])
# 用紅色艰山、粗體/斜體字體來(lái)創(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è)圖例湖雹,通過(guò)cex(默認(rèn)值為 1)設(shè)置圖例大小
# 并使用與實(shí)際繪圖相同的線條顏色和點(diǎn)來(lái)繪制圖例
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è)圖例,該圖例稍小并且沒(méi)有邊框
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)單條形圖開(kāi)始:
# 定義具有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)在讓我們用一些顏色畫(huà)出每天各汽車情況汤求,并顯示一個(gè)圖例:
# 使用彩虹色自動(dòng)繪制帶有相鄰條的圖
barplot(as.matrix(autos_data), main="Autos", ylab= "Total",
beside=TRUE, col=rainbow(5))
# 將圖例放置在左上角俏险,使用彩虹色且無(wú)邊框
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è)向量連接起來(lái)
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è)向量連接起來(lái)
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ù)軸上看起來(lái)更好,并且讓我們使用帶點(diǎn)的圖來(lái)顯示分布滔吠。
# 生成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)圖
先來(lái)個(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. 箱圖
先來(lái)個(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. 一維圖
來(lái)看兩個(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)幫助呵晚。