《R语言实战》第6章

Posted starjuly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《R语言实战》第6章相关的知识,希望对你有一定的参考价值。

# 第六章 基本图形
# 本章内容
# 条形图、箱线图和点图 
# 饼图和扇形图
# 直方图与核密度图

# 6.1 条形图
# 条形图通过垂直的或水平的条形展示了类别型变量的分布(频数)。
# 在接下来的示例中,我们将绘制一项探索类风湿性关节炎新疗法研究的结果。数据已包含在随vcd包分发的Arthritis数据框中。由于vcd包并没用包括在R的默认安装中,请确保在第一 次使用之前先下载并安装它
install.packages("vcd")

# 6.1.1 简单的条形图
library(vcd)
counts <- table(Arthritis$Improved)
# 查看结果
counts 
# 代码清单6-1 简单的条形图
barplot(counts,
        main = "Simple Bar Plot",
        xlab = "Improvement", ylab = "Frequency")
# 水平条形图
barplot(counts,
        main = "Horizontal Bar Plot",
        xlab = "Frequency", ylab = "Improvement",
        horiz = TRUE)
# 若要绘制的类别型变量是一个因子或有序型因子,就可以使用函数plot()快速创建一幅垂直条形图。由于Arthritis$Improved是一个因子,所以代码:
plot(Arthritis$Improved, main = "Simple Bar Plot",
     xlab = "Improved", ylab = "Frequency")
# 以下代码在MacOs中不能使用hozize
# plot(Arthritis$Improved, main = "Horizontal Bar Plot",
#      xlab = "Frequency", ylab = "Improvement",
#      horize = TRUE)

# 6.1.2 堆砌条形图和分组条形图
# 如果height是一个矩阵而不是一个向量,则绘图结果将是一幅堆砌条形图或分组条形图。 若beside=FALSE(默认值),则矩阵中的每一列都将生成图中的一个条形,各列中的值将给出 堆砌的“子条”的高度。若beside=TRUE,则矩阵中的每一列都表示一个分组,各列中的值将 并列而不是堆砌。
# 考虑治疗类型和改善情况的列联表:
library(vcd)
counts <- table(Arthritis$Improved, Arthritis$Treatment)
counts
# 代码清单6-2 堆砌条形图和分组条形图
# 堆砌条形图
barplot(counts,
        main = "Stacked Bar Flot",
        xlab = "Treatment", ylab = "Frequency",
        col = c("red", "yellow", "green"))
# 分组条形图
barplot(counts,
        main = "Grouped Bar Plot",
        xlab = "Treatment", ylab = "Frequency",
        col = c("red", "yellow", "green"),
        legend = row.names(counts), beside = TRUE)

# 6.1.3 均值条形图
states <- data.frame(state.region, state.x77)
means <- aggregate(states$Illiteracy, by = list(state.region), FUN = mean)
# 将均值从小到大排序
means <- means[order(means$x), ]
# means$x是包含各条形高度的向量,而添加选项names.arg=means$Group.1 是为了展示标签。
barplot(means$x, names.arg = means$Group.1)
# 添加标题
title("Mean Illiteracy Rate")
# 自己添加线
lines(means$x, type = "p")


# 6.1.4 条形图的微调
# 可以使用参数cex.names来减小字号。将其指定为小于1的值可以缩小标签的大小。可选的参 数names.arg允许你指定一个字符向量作为条形的标签名。
# 代码清单6-4 为条形图搭配标签
# (使用mar)增加了y 边界的大小
par(mar = c(5, 8, 4, 2))
# (使用las=2)旋转了条形的标签、修改了标签文本
par(las = 2)
counts <- table(Arthritis$Improved)
barplot(counts,
        main = "Treatment Outcome",
        horiz = TRUE, cex.names = 0.8,
        names.arg = c("No Improvement", "Some Improvement",
                      "Marked Improvement"))

# 6.1.5 棘状图
# 棘状图对堆砌条形图进行了重缩放,这样每个条形的高度均为1,每一段的高度即表示比例。棘状图可由vcd包中的函数spine()绘制。
library(vcd)
attach(Arthritis)
counts <- table(Treatment, Improved)
spine(counts, main = "Spinogram Example")
detach(Arthritis)



# 6.2 饼图
# 将四副图形组合为一幅
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, "%", seq="")
pie(slices, labels = lbls2,
    col = rainbow(length(lbls2)),
    main = "Pie Chart with Percentages")
# 创建三维饼图
#install.packages("plotrix")
library(plotrix)
pie3D(slices, labels = lbls, explode = 0.1, 
      labelcex = 0.8, main = "3D Pie Chart")
# 从表格创建饼图
mytable <- table(state.region)
lbls3 <- paste(names(mytable), "\\n", mytable, seq="")
pie(mytable, lables = lbls3,
    main = "Pie Chart from a Table \\n (with sample sizes)")

# 扇形图(fan plot)
library(plotrix)
slices <- c(10, 12, 4, 16, 8)
lbls <- c("US", "UK", "Australia", "Germanny", "France")
fan.plot(slices, labels = lbls, main = "Fan Plot")


# 6.3 直方图
# 直方图通过在X 轴上将值域分割为一定数量的组,在Y 轴上显示相应值的频数,展示了连续型变量的分布。可以使用如下函数创建直方图:
# hist(x)
# 其中的x是一个由数据值组成的数值向量。参数freq=FALSE表示根据概率密度而不是频数绘制 图形。参数breaks用于控制组的数量。在定义直方图中的单元时,默认将生成等距切分。
# 代码清单6-6 直方图
par(mfrow = c(2, 2))
# 1、简单直方图
hist(mtcars$mpg)
# 2、指定数组和颜色
hist(mtcars$mpg,
     breaks = 12,
     col = "red",
     xlab = "Miles Per Gallon",
     main = "Colored histogram with 12 bins")
# 3、添加轴须图
hist(mtcars$mpg,
     freq = FALSE,
     breaks = 12,
     col = "red",
     xlab = "Miles Per Gallon",
     main = "Histogram, run plot, density curve")
#   叠加了一条密度曲线 和轴须图(rug plot)。这条密度曲线是一个核密度估计
rug(jitter(mtcars$mpg))
#   使用lines()函数叠加了这条蓝色、双倍默认线条宽度的曲线。
lines(density(mtcars$mpg), col = "blue", lwd = 2)
# 4、添加正态密度曲线和外框
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))
lines(xfit, yfit, col = "blue", lwd = 2)
box()


# 6.4 核密度图
# 核密度估计是用于估计随机变 量概率密度函数的一种非参数方法。从总体上讲,核 密度图不失为一种用来观察连续型变量分布的有效方法。绘制密度图的方法(不叠加到另一幅图 上方)为:
# plot(density(x))
# 其中的x是一个数值型向量。由于plot()函数会创建一幅新的图形,所以要向一幅已经存在的图 形上叠加一条密度曲线,可以使用lines()函数
# 代码清单6-7 核密度图
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")

#  使用sm包中的sm.density.compare()函数可向图形叠加两组或更多的核密度图。使用格市为:
# sm.dennsity.compare(x, factor)
# 其中的x是一个数值型向量,factor是一个分组变量。请在第一次使用sm包之前先安装它。
# 代码清单6-8 可比较的核密度图
# 双倍线条宽度
install.packages("sm")
nopar(lwd = 2)
# 找不到 sm 包?! 所以下面的代码就执行不了了
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(l), levels(cyl.f), fill = colfill)
detach(mtcars)



# 6.5 箱线图
# 箱线图(又称盒须图)通过绘制连续型变量的五数总括,即最小值、下四分位数(第25百分 位数)、中位数(第50百分位数)、上四分位数(第75百分位数)以及最大值,描述了连续型变量 的分布。
# 箱线图能够显示出可能为离群点(范围±1.5*IQR以外的值,IQR表示四分位距,即上 四分位数与下四分位数的差值)的观测。
# 例如:
boxplot(mtcars$mpg, main = "Box plot", ylab = "Miles per Gallon")
# 通过一下语句可以查看每加仑汽油行驶英里数的中位数是19.2,50%的值都落在了15.3和22.8之间,最小值为10.4,最大值为33.9。
boxplot.stats(mtcars$mpg)

# 6.5.1 使用并列箱线图进行跨组比较
# 箱线图可以展示单个变量或分组变量。使用格式为:
# boxplot(formula, data = data.frame)
# 其中的formula是一个公式,dataframe代表提供数据的数据框(或列表)。一个示例公式为y ~ A,这将为类别型变量A的每个值并列地生成数值型变量y的箱线图。公式y ~ A*B则将为类别型 变量A和B所有水平的两两组合生成数值型变量y的箱线图。
# 添加参数varwidth=TRUE将使箱线图的宽度与其样本大小的平方根成正比。参数 horizontal=TRUE可以反转坐标轴的方向
# 在以下代码中,我们使用并列箱线图重新研究了四缸、六缸、八缸发动机对每加仑汽油行驶 的英里数的影响。
boxplot(mpg ~ cyl, data = mtcars,
        main = "Car Mileage Data",
        xlab = "Number of Cylinders",
        ylab = "Miles Per Gallon")

# 箱线图灵活多变,通过添加notch=TRUE,可以得到含凹槽的箱线图。若两个箱的凹槽互不 重叠,则表明它们的中位数有显著差异(Chambers et al., 1983, p. 62)。以下代码将为我们的车型 油耗示例创建一幅含凹槽的箱线图:
boxplot(mpg ~ cyl, data = mtcars,
        notch = TRUE,
        varwidth = TRUE,
        col = "red",
        main = "Car Mileage Data",
        xlab = "Number of Cylinders",
        ylab = "Miles Per Gallon")
# 参数col以红色填充了箱线图,而varwidth=TRUE则使箱线图的宽度与它们各自的样本大小 成正比。

# 代码清单6-9 两个交叉因子的箱线图
# 创建汽缸数量的因子
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")


# 6.5.2 小提琴图
# 小提琴图是箱线图与核密度图的结合。你可以使用vioplot包中的vioplot()函数绘制它。请在第一次使用之前先安装vioplot包。
# vioplot()函数的使用格式为:
# Vioplot(x1, x2, ..., names = , col =)
# 其中x1, x2, ...表示要绘制的一个或多个数值向量(将为每个向量绘制一幅小提琴图)。参数 names是小提琴图中标签的字符向量,而col是一个为每幅小提琴图指定颜色的向量。
# 代码清单6-10 小提琴图
install.packages("vioplot")
# 执行以下代码报错:Error: package ‘sm’ required by ‘vioplot’ could not be found
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")



# 6.6 点图
# 点图提供了一种在简单水平刻度上绘制大量有标签值的方法。你可以使用dotchart()函数创建点图,格式为:
# dotchart(x, labels = )
# 其中的x是一个数值向量,而labels则是由每个点的标签组成的向量。你可以通过添加参数groups来选定一个因子,用以指定x中元素的分组方式。如果这样做,则参数gcolor可以控制 不同组标签的颜色,cex可控制标签的大小。这里是mtcars数据集的一个示例:
dotchart(mtcars$mpg, labels = row.names(mtcars), cex = .7,
         main = "Gas Mileage for Car Models",
         xlab = "Miles Per Gallon")
# 以上代码可以在在同一个水平轴上观察每种车型的每加仑汽油行驶英里数
# 代码清单6-11 分组、排序、着色后的点图
x <- mtcars[order(mtcars$mpg),]
x$cyl <- factor(x$cyl)
x$color[x$cyl == 4] <- "red"
x$color[x$cyl == 6] <- "blue"
x$color[x$cyl == 8] <- "darkgreen"
# 根据每加仑汽油行驶英里数(从最低到最高)对数据框mtcars进行排序,结果 保存为数据框x。数值向量cyl被转换为一个因子。一个字符型向量(color)被添加到了数据框 x中,根据cyl的值,它所含的值为"red"、"blue"或"darkgreen"。另外,各数据点的标签取自数据框的行名(车辆型号)。数据点根据汽缸数量分组。数字4、6和8以黑色显示。点和标签的
# 在本例中,你可以从点图中获得显著的洞察力,因为每个点都有标签,每个点的值都有其内 在含义,并且这些点是以一种能够促进比较的方式排布的。但是随着数据点的增多,点图的实用 14 性随之下降。颜色来自向量color,点以填充的圆圈表示。
dotchart(x$mpg,
        labels = row.names(x),
        cex = .7,
        groups = x$cyl,
        gcolor = "black",
        color = x$color,
        pch = 19,
        main = "Gas Mileage for Car Models\\n grouped by cylinder",
        xlab = "Miles Per Gallon")

以上是关于《R语言实战》第6章的主要内容,如果未能解决你的问题,请参考以下文章

R语言实战-云图

R语言实战 第7章

R语言可视化绘制基本图形

R语言ggplot2可视化小提琴图分组小提琴图分离的小提琴图实战

《R语言实战》第1章

《R语言实战》第4章