第三章:par()函数能够让你对R的默认图形做出大量修改
本章内容
条形图、箱线图和点图
饼图和扇形图
直方图与核密度图
将变量的分布进行可视化展示;
通过结果变量进行跨组比较
图形及对应代码
6.1 条形图
图形以及对应的代码
图形 | 代码 | 示例 |
简单 height是向量 | 选项horiz=TRUE则会生成一幅水平条形图 | barplot(counts, main="Simple Bar Plot", xlab="Improvement", ylab="Frequency") barplot(counts, main="Horizontal Bar Plot", xlab="Frequency", ylab="Improvement", horiz=TRUE) |
注意:若要绘制的类别型变量是一个因子或有序型因子,就可以使用函数plot()快速创建一幅 垂直条形图。 所以,上述的写法也可以变成: plot(Arthritis$Improved, main="Simple Bar Plot", xlab="Improved", ylab="Frequency") plot(Arthritis$Improved, horiz=TRUE, main="Horizontal Bar Plot", xlab="Frequency", ylab="Improved") | ||
堆砌条形图和分组条形图 height是矩阵 |
TRUE:并列
| 堆砌: barplot(counts, main="Stacked Bar Plot", xlab="Treatment", ylab="Frequency", col=c("red", "yellow","green"), legend=rownames(counts)) 分组: barplot(counts, main="Grouped Bar Plot", xlab="Treatment", ylab="Frequency", col=c("red", "yellow", "green"), legend=rownames(counts), beside=TRUE) |
均值条形图 | 各个条形可以使用lines()函数绘制的线段连接起来。 | |
微调 |
| |
棘状图(一种特殊的条形图) | 棘状图对堆砌条形图进行了重缩放,这样每个条形的高度均为1,每一段的高度即 表示比例 |
library(vcd) attach(Arthritis) counts <- table(Treatment, Improved) spine(counts, main="Spinogram Example") detach(Arthritis) |
均值条形图:
条形图并不一定要基于计数数据或频率数据。你可以使用数据整合函数并将结果传递给 barplot()函数,来创建表示均值、中位数、标准差等的条形图
states <- data.frame(state.region, state.x77)
means <- aggregate(states$Illiteracy, by=list(state.region), FUN=mean)
# 聚类,按state和region聚类
means
means <- means[order(means$x),]
# 排序
means
barplot(means$x, names.arg=means$Group.1)
# 用x来画条形图,且变量名=means$Group.1
title("Mean Illiteracy Rate")
# 使用title()函数与调用plot()时添加main选项是等价的,都是主标题
6.2 饼图:pie(x, labels)
- 饼图让比较各扇形的值变得困难(除非这些值被附加在标签上)
- 其中x是一个非负数值向量,表示每个扇形的面积,而labels则是表示各扇形标签的字符型向量。
例子
# 将四幅图形组合为一幅
par(mfrow=c(2, 2))
# 第一个饼图
slices <- c(10, 12,4, 16, 8)
lbls <- c("US", "UK", "Australia", "Germany", "France")
pie(slices, labels = lbls, main="Simple Pie Chart")
# 为饼图添加比例数值
pct <- round(slices/sum(slices)*100)
lbls2 <- paste(lbls, " ", pct, "%", sep="")
pie(slices, labels=lbls2, col=rainbow(length(lbls2)),
main="Pie Chart with Percentages")
# 从表格创建饼图
library(plotrix)
pie3D(slices, labels=lbls,explode=0.1,
main="3D Pie Chart ")
mytable <- table(state.region)
lbls3 <- paste(names(mytable), "\n", mytable, sep="")
pie(mytable, labels = lbls3,
main="Pie Chart from a Table\n (with sample sizes)")
第一步,做图形设置,形成2*2表格
输入数据
饼图1:pie(x,labels=y,main="主标题")
饼图2:
- 将样本数换为比例值:pct <- round(slices/sum(slices)*100)
- lbls赋值成:paste(lbls,空格,pct(比例),连接符%,sep="")
- 颜色用rainbow()定义:rainbow(length(lbls2))即按标签数量,五个,来为图形提供五种颜色
饼图3:
- 使用plotrix包中的pie3D(),创建三维饼图
饼图4:从表格创建饼图。
扇形图
饼图让比较各扇形的值变得困难(除非这些值被附加在标签上)。
- 为改善这种状况,我们创造了一种称为扇形图(fan plot)的饼图变种。
- 扇形图(Lemon & Tyagi,2009)提供了一种同时展示相对数量和相互差异的方法。
- 在R中,扇形图是通过plotrix 包中的fan.plot()函数实现的。
- 在一幅扇形图中,各个扇形相互叠加,并对半径做了修改,这样所有扇形就都是可见的。
- 在这里扇形的宽度(width)是重要的,而半径并不重要。
library(plotrix)
slices <- c(10, 12,4, 16, 8)
lbls <- c("US", "UK", "Australia", "Germany", "France")
fan.plot(slices, labels = lbls, main="Fan Plot")
6.3 直方图:hist(x)
- 其中的x是一个由数据值组成的数值向量。
- 参数freq=FALSE表示根据概率密度而不是频数绘制图形。
- 参数breaks用于控制组的数量。
- 在定义直方图中的单元时,默认将生成等距切分。
par(mfrow=c(2,2))
hist(mtcars$mpg)
# 最简单的直方图
hist(mtcars$mpg,
breaks=12, # 指定了组数
col="red", # 指定了颜色
xlab="Miles Per Gallon",
main="Colored histogram with 12 bins")
hist(mtcars$mpg,
freq=FALSE, # 变成了density
breaks=12,
col="red",
xlab="Miles Per Gallon",
main="Histogram, rug plot, density curve")
rug(jitter(mtcars$mpg))
lines(density(mtcars$mpg), col="blue", lwd=2) # 添加轴须图
x <- mtcars$mpg
h<-hist(x,
breaks=12,
col="red",
xlab="Miles Per Gallon",
main="Histogram with normal curve and box")
xfit<-seq(min(x), max(x), length=40)
yfit<-dnorm(xfit, mean=mean(x), sd=sd(x))
yfit <- yfit*diff(h$mids[1:2])*length(x)
lines(xfit, yfit, col="blue", lwd=2) # 添加正态分布线
box() #添加外框
第三张图:
保留了上一幅图中的颜色、组数、标签和标题设置,又叠加了一条密度曲线 和轴须图(rug plot)。
- 这条密度曲线是一个核密度估计,会在下节中描述:为数据的分布提供 了一种更加平滑的描述
- 使用lines()函数叠加了这条蓝色、双倍默认线条宽度的曲线。最后,轴须图是实际数据值的一种一维呈现方式。
- 如果数据中有许多结①【出现相同的值,称为结(tie)。】,你可以使用如下代码将 轴须图的数据打散:
- rug(jitter(mtcars$mpag, amount=0.01))
- 这样将向每个数据点添加一个小的随机值(一个±amount之间的均匀分布随机数),以避免重叠 的点产生影响
6.4 核密度图:核密度估计是用于估计随机变量概率密度函数的一种非参数方法。plot(density(x));核密度图可用于比较组间差异
- 其中的x是一个数值型向量。
- 由于plot()函数会创建一幅新的图形,所以要向一幅已经存在的图 形上叠加一条密度曲线,可以使用lines()函数
- polygon()函数根据顶点的x和y坐标(本例中由density()函数提供)绘制了多边形
- 使用sm包中的sm.density.compare()函数可向图形叠加两组或更多的核密度图。
- 使用格 式为: sm.density.compare(x, factor)
- x是一个数值型向量,factor是一个分组变量。
核密度图举例
par(mfrow=c(2,1))
d <- density(mtcars$mpg)
plot(d) # 默认设置创建最简图形
d <- density(mtcars$mpg)
plot(d, main="Kernel Density of Miles Per Gallon") #添加一个标题
polygon(d, col="red", border="blue") #将曲线修改为蓝色,并使用实心红色填充曲线下方的区域
rug(mtcars$mpg, col="brown") # 添加棕色的轴须图
可比较的核密度图
library(sm)
attach(mtcars)
cyl.f <- factor(cyl, levels= c(4,6,8),
labels = c("4 cylinder", "6 cylinder","8 cylinder")) #创建分组因子
sm.density.compare(mpg, cyl, xlab="Miles Per Gallon")
title(main="MPG Distribution by Car Cylinders") # 绘制密度图
colfill<-c(2:(1+length(levels(cyl.f))))
legend(locator(1), levels(cyl.f), fill=colfill) # 通过鼠标单击添加图例
detach(mtcars)
- 在数据框mtcars中,变量cyl是一个以4、6或8 编码的数值型变量。
- 为了向图形提供值的标签,这里cyl转换为名为cyl.f的因子。要赋值factor
- 添加一个图例以增加可解释性
- 首先创建的是一个颜色向 量,这里的colfill值为c(2, 3, 4)。
- 然后通过legend()函数向图形上添加一个图例。
- 第一 个参数值locator(1)表示用鼠标点击想让图例出现的位置来交互式地放置这个图例。
- 第二个参 数值则是由标签组成的字符向量。
- 第三个参数值使用向量colfill为cyl.f的每一个水平指定了一 种颜色。
- 核密度图的叠加不失为一种在某个结果变量上跨组比较观测的强大方法。你可以 看到不同组所含值的分布形状,以及不同组之间的重叠程度
6.5 箱型图:箱线图能够显示出可能为离群点的观测
boxplot(mtcars$mpg, main="Box plot", ylab="Miles per Gallon")
- 默认情况下,两条须的延伸极限不会超过盒型各端加1.5倍四分位距的范围。此范围以外的 值将以点来表示
6.5.1 使用并列箱型图进行跨组比较
箱线图可以展示单个变量或分组变量。使用格式为:
- 其中的formula是一个公式,dataframe代表提供数据的数据框(或列表)。
- 添加参数varwidth=TRUE将使箱线图的宽度与其样本大小的平方根成正比。
- 参数 horizontal=TRUE可以反转坐标轴的方向
boxplot(formula, data=dataframe)
我们使用并列箱线图重新研究了四缸、六缸、八缸发动机对每加仑汽油行驶 的英里数的影响。
boxplot(mpg ~ cyl, data=mtcars,
main="Car Mileage Data",
xlab="Number of Cylinders",
ylab="Miles Per Gallon")
- 为类别型变量A的每个值并列地生成数值型变量y的箱线图。
- 公式y ~ A*B则将为类别型 变量A和B所有水平的两两组合生成数值型变量y的箱线图。
在图6-12中可以看到不同组间油耗的区别非常明显。同时也可以发现,六缸车型的每加仑汽 油行驶的英里数分布较其他两类车型更为均匀。与六缸和八缸车型相比,四缸车型的每加仑汽油 行驶的英里数散布最广(且正偏)。在八缸组还有一个离群点。
- 箱线图灵活多变,通过添加notch=TRUE,可以得到含凹槽的箱线图。
- 若两个箱的凹槽互不重叠,则表明它们的中位数有显著差异
- 参数col以红色填充了箱线图,
- 而varwidth=TRUE则使箱线图的宽度与它们各自的样本大小成 正比。
boxplot(mpg ~ cyl, data=mtcars,
notch=TRUE,
varwidth=TRUE,
col="red",
main="Car Mileage Data",
xlab="Number of Cylinders",
ylab="Miles Per Gallon")
最后,你可以为多个分组因子绘制箱线图。代码清单6-9为不同缸数和不同变速箱类型的车 型绘制了每加仑汽油行驶英里数的箱线图(图形如图6-14所示)。
同样地,这里使用参数col为箱 线图进行了着色。请注意颜色的循环使用。在本例中,共有六幅箱线图和两种指定的颜色,所以 颜色将重复使用三次。
两个交叉因子的箱型图
mtcars$cyl.f <- factor(mtcars$cyl,
levels=c(4,6,8),
labels=c("4","6","8"))
# 创建气缸数量的因子
mtcars$am.f <- factor(mtcars$am,
levels=c(0,1),
labels=c("auto", "standard"))
# 创建变速箱类型的因子
boxplot(mpg ~ am.f *cyl.f,
data=mtcars,
varwidth=TRUE,
col=c("gold","darkgreen"),
main="MPG Distribution by Auto Type",
xlab="Auto Type", ylab="Miles Per Gallon")
#形成箱型图
图6-14再一次清晰地显示出油耗随着缸数的下降而减少。
对于四缸和六缸车型,标准变速箱 (standard)的油耗更高。但是对于八缸车型,油耗似乎没有差别。
你也可以从箱线图的宽度看出, 四缸标准变速箱的车型和八缸自动变速箱的车型在数据集中最常见。
6.5.2 小提琴图:箱线图与核密度图的结合:使用vioplot包中的vioplot()函数
- vioplot()函数的使用格式为:vioplot(x1, x2, ... , names=, col=)
- 其中x1, x2, ...表示要绘制的一个或多个数值向量(将为每个向量绘制一幅小提琴图)。
- 参数 names是小提琴图中标签的字符向量,
- col是一个为每幅小提琴图指定颜色的向量。
library(vioplot)
x1 <- mtcars$mpg[mtcars$cyl==4]
x2 <- mtcars$mpg[mtcars$cyl==6]
x3 <- mtcars$mpg[mtcars$cyl==8]
vioplot(x1, x2, x3,
names=c("4 cyl", "6 cyl", "8 cyl"),
col="gold")
title("Violin Plots of Miles Per Gallon", ylab="Miles Per Gallon",
xlab="Number of Cylinders")
小提琴图基本上是核密度图以镜像方式在箱线图上的叠加。
在图中,白点是中位数,黑色盒 型的范围是下四分位点到上四分位点,细黑线表示须。
外部形状即为核密度估计。
6.6 点图:dotchart(x, labels=)
- 其中的x是一个数值向量,
- 而labels则是由每个点的标签组成的向量。
- 你可以通过添加参数 groups来选定一个因子,用以指定x中元素的分组方式。
- 参数gcolor可以控制不同组标签的颜色
- cex可以控制标签的大小。
dotchart(mtcars$mpg, labels=row.names(mtcars), cex=.7,
main="Gas Mileage for Car Models",
xlab="Miles Per Gallon")
图6-16可以让你在同一个水平轴上观察每种车型的每加仑汽油行驶英里数。
通常来说,点图 在经过排序并且分组变量被不同的符号和颜色区分开的时候最有用。
例子:分组、排序、着色后的点图
x <- mtcars[order(mtcars$mpg),]
#根据每加仑汽油行驶英里数(从最低到最高)对数据框mtcars进行排序,结果保存为数据框x
x$cyl <- factor(x$cyl)
#将数值向量 cyl 转换为一个因子,才能做后面的分组
x$color[x$cyl==4] <- "red"
x$color[x$cyl==6] <- "blue"
x$color[x$cyl==8] <- "darkgreen"
#添加一个字符型向量(color)到数据框x中,根据cyl的值,它所含的值为"red"、"blue"或"darkgreen"
dotchart(x$mpg,
labels = row.names(x),
cex=.7,
groups = x$cyl, # 数据点根据汽缸数量分组
gcolor = "black",
color = x$color, # 点和标签的颜色来自向量color
pch=19,
main = "Gas Mileage for Car Models\ngrouped by cylinder",
xlab = "Miles Per Gallon")
x$color[x$cyl==4] <- "red"
x$color[x$cyl==6] <- "blue"
x$color[x$cyl==8] <- "darkgreen"
#添加一个字符型向量(color)到数据框x中,根据cyl的值,它所含的值为"red"、"blue"或"darkgreen"
在本例中,你可以从点图中获得显著的洞察力,因为每个点都有标签,每个点的值都有其内 在含义,并且这些点是以一种能够促进比较的方式排布的。但是随着数据点的增多,点图的实用 性随之下降。
注意:点图有许多变种。Jacoby(2006)对点图进行了非常有意义的讨论,并且提供了创新型应 用的R代码。此外,Hmisc包也提供了一个带有许多附加功能的点图函数(恰如其分地叫 作dotchart2)