数据可视化,绝对是一门艺术。完美的数据,需要有完美的图片来展示。人类非常善于从视觉呈现中洞察关系。一幅精心绘制的图形能够帮助你在数以千计的零散信息中做出有意义的比较,提炼出使用其他方法时不那么容易发现的模式。而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:这一部分内容确实比较多,整个下来比较累,进度比较慢,图形的参数确实比较多,要多练习,多用才可以。