R語言初級(jí)教程(24): 基本繪圖

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)幫助。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容