數據可視化,絕對是一門藝術。完美的數據,需要有完美的圖片來展示。人類非常善于從視覺呈現中洞察關系。一幅精心繪制的圖形能夠幫助你在數以千計的零散信息中做出有意義的比較,提煉出使用其他方法時不那么容易發現的模式。而R具有頂尖水準的制圖功能,進行很好的可視化。
3.1 使用圖形
R是一個驚艷的圖形構建平臺。在通常的交互式會話中,你可以通過逐條輸入語句構建圖形,逐漸完善圖形特征,直至得到想要的結果。
attach(mtcars)
plot(wt, mpg)
abline(lm(mpg~wt))
title("Regression of MPG on Weight")
detach(mtcars)
3.2 一個簡單的例子
# 數據導入R中
dose <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)
# 繪圖,對藥物A的響應
plot(dose, drugA, type="b")
plot()是一個函數,plot(x, y, type="b"),將x作為橫軸,y置于縱軸,繪制點集,連線。選項type=“b”表示同時繪制點和線,具體的可以用
?plot
查看幫助選項。
3.3.1 符號和線條
使用圖形參數來指定繪圖時使用的符號和線條類型。
3.3.2 顏色
在R語言中,可以通過下標、顏色名稱、十六進制的顏色值、RGB值或HSV值來指定顏色。函數colors()
可以返回所有可用顏色的名稱。
# RColorBrewer 這個包是用來創建吸引人的顏色配對
install.packages("RColorBrewer")
library(RColorBrewer)
n <- 7
# 產生七種顏色的向量,
mycolors <- brewer.pal(n, "Set1")
# 最后畫出BAR圖
barplot(rep(1,n), col=mycolors)
gray()
函數可以生成多階灰度色,rainbow()
可以生成連續的“彩虹型”顏色
n <- 10
mycolors <- rainbow(n)
pie(rep(1, n), labels=mycolors, col=mycolors)
mygrays <- gray(0:n/n)
pie(rep(1, n), labels=mygrays, col=mygrays)
3.3.3 文本屬性
圖形參數同樣可以用來指定字號、字體和字樣。
3.3.4 圖形尺寸與邊界尺寸
- 通過圖形參數控制圖形外觀
dose <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)
# 生成可以修改的當前圖形參數列表
opar <- par(no.readonly=TRUE)
# 2英寸寬,3英寸高
par(pin=c(2, 3))
# 線條寬度為默認的2倍,符號為默認的1.5倍
par(lwd=2, cex=1.5)
# 坐標軸刻度文本被設置為斜體,縮小為原來的75%
par(cex.axis=.75, font.axis=3)
# 使用紅色的實心圓圈和虛線創建第一幅圖
plot(dose, drugA, type="b", pch=19, lty=2, col="red")
# 使用綠色填充的綠色菱形加藍色虛線創建了第二幅圖
plot(dose, drugB, type="b", pch=23, lty=6, col="blue", bg="green")
# 恢復初始的圖形參數設置
par(opar)
par()
的參數設定對兩幅圖都有效,而在plot()
函數中指定的函數只對當前的圖有效。
3.4 添加文本、自定義坐標軸和圖例
可以添加標題main、副標題sub、坐標軸標簽(xlab、ylab)并指定了坐標軸范圍(xlim、ylim)。當然并不是所有的函數都支持這些選項。
plot(dose, drugA, type="b",
col="red", lty=2, pch=2, lwd=2,
main="Clinical Trials for Drug A",
sub="This is hypothetical data",
xlab="Dosage", ylab="Drug Response",
xlim=c(0, 60), ylim=c(0, 70))
3.4.1 標題
title()
函數可以為圖形添加標題和坐標軸標簽,當然也是可以指定其他圖形參數。調用形式:
title(main="", sub="", xlab="", ylab="", col.main="")
3.4.2 坐標軸
可以使用axis()
函數來創建自定義的坐標軸,但是你要禁止使用繪圖函數自動生成的坐標軸,axes=FALSE
禁用全部坐標軸,坐標軸創建的選項:
自定義坐標軸的例子:
x <- c(1:10)
y <- x
z <- 10/x
# 保存當前的所有參數
opar <- par(no.readonly=TRUE)
# 設置邊界大小
par(mar=c(5, 4, 4, 8) + 0.1)
# 繪圖,符號是21,線是紅色,
plot(x, y, type="b",
pch=21, col="red",
yaxt="n", lty=3, ann=FALSE)
# 在圖上繪制第二條線,藍色
lines(x, z, type="b", pch=22, col="blue", lty=2)
# 在左邊建立y軸,坐標軸刻度為x向量,顏色紅色,垂直于坐標抽
axis(2, at=x, labels=x, col.axis="red", las=2)
# 在右邊建立坐標軸,刻度為z向量保留兩位小數,藍色,垂直,刻度文字為70%,刻度線向外0.01
axis(4, at=z, labels=round(z, digits=2),
col.axis="blue", las=2, cex.axis=0.7, tck=-.01)
# 為坐標軸添加文本,右邊,添加y=1/x,垂直于坐標,藍色,正常大小
mtext("y=1/x", side=4, line=3, cex.lab=1, las=2, col="blue")
# 添加坐標軸標簽
title("An Example of Creative Axes",
xlab="X values",
ylab="Y=X")
par(opar)
3.4.3 參考線
abline()
可以用來添加參考線,格式:abline(h=yvalues, v=xvalues)
,里面也是可以指定其他圖形參數。
3.4.4 圖例
當圖形中包含的數據不止一組時,圖例可以判斷。legend()
來添加圖例:legend(location, title, legend, ...)
兩種藥物響應情況:
dose <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)
opar <- par(no.readonly=TRUE)
par(lwd=2, cex=1.5, font.lab=2)
plot(dose, drugA, type="b",
pch=15, lty=1, col="red", ylim=c(0, 60),
main="Drug A vs. Drug B",
xlab="Drug Dosage", ylab="Drug Response")
lines(dose, drugB, type="b",
pch=17, lty=2, col="blue")
abline(h=c(30), lwd=1.5, lty=2, col="gray")
library(Hmisc)
minor.tick(nx=3, ny=3, tick.ratio=0.5)
legend("topleft", inset=.05, title="Drug Type", c("A","B")
lty=c(1, 2), pch=c(15, 17), col=c("red", "blue"))
par(opar)
3.4.5 文本標注
通過函數text()
和mtext()
將文本添加到圖形上。前者可向繪圖區域內部添加文本,而后者向圖形的四個邊界之一添加文本。
示例:
attach(mtcars)
plot(wt, mpg,
main="Mileage vs. Car Weight",
xlab="Weight", ylab="Mileage",
pch=18, col="blue")
text(wt, mpg,
row.names(mtcars),
cex=0.6, pos=4, col="red")
detach(mtcars)
3.4.6 數學標注
函數plotmath()
可以為圖形主體或邊界上的標題、坐標軸名稱或文本標注添加數學符號。
3.5 圖形組合
在R中使用函數par()
和layout()
可以組合多幅圖形為一幅總括圖形。圖形參數mfrow=c(nrows, ncols)按行填充和mfcol=c(nrows, ncol)按列填充。示例:
attach(mtcars)
opar <- par(no.readonly=TRUE)
# 按行填充,2x2矩陣
par(mfrow=c(2,2))
# 畫四幅圖
plot(wt,mpg, main="Scatterplot of wt vs. mpg")
plot(wt,disp, main="Scatterplot of wt vs. disp")
hist(wt, main="Histogram of wt")
boxplot(wt, main="Boxplot of wt")
par(opar)
detach(mtcars)
PS:這一部分內容確實比較多,整個下來比較累,進度比較慢,圖形的參數確實比較多,要多練習,多用才可以。