【R语言与数据分析实战】绘图

1、散点图

        散点图中,实际数据值由点在图中的位置表示,由plot()负责绘制。plot()函数可以绘制的对象如下:

        plot()绘制散点图的方法:

plot(x,y)

        例如,使用mlbench包中的Ozone数据集绘制散点图:

install.packages("mlbench") 
library(mlbench)  #加载mlbench包
data(Ozone)       #使用data()命令读入Ozone数据集
plot(Ozone$V8,Ozone$V9)
图1 桑德堡(V8)与艾尔蒙地(V9)地区的温度

2、图像选项

图像选项含义
xlab,ylabX与Y轴名称
main图像标题
pch点的类型
cex点的大小
col颜色
xlim,ylimX与Y轴的值范围
type图像类型,有点(p)、线(l)、点线(b)等

2.1 坐标轴名称

plot(x,y,xlab,ylab) #X轴名称设置xlab,Y轴名称设置为ylab

        例如:

plot(Ozone$V8, Ozone$V9, xlab = "Sandburg Temperature", ylab = "El Monte Temperature")
图2 使用xlab、ylab为散点图的坐标轴设置名称

2.2 图形标题

plot(x,y,main) #main设置散点图标题

        例如:

plot(Ozone$V8, Ozone$V9, xlab = "Sandburg Temperature", ylab = "El Monte Temperature")
图3 使用main参数为图像设置标题

2.3 点的类型

        参数pch可设置为数字或字符。设置为数字0-18表示使用S语言的特殊字符,19-25指R扩展后使用的特殊字符。26-31表示未使用的值,32-127表示ASCII码。运行example(points)命令,查看各pch值代表哪种符号。将参数pch设置为字符,则根据指定字符绘制图形。

plot(x,y,pch) #使用pch指定的点类型绘制X、Y

        例如:

plot(Ozone$V8, Ozone$V9, xlab = "Sandburg Temperature", ylab = "El Monte Temperature", 
    main = "Ozone", pch = 20)
plot(Ozone$V8, Ozone$V9, xlab = "Sandburg Temperature", ylab = "El Monte Temperature", 
    main = "Ozone", pch = "+")

在这里插入图片描述

图4 使用参数pch指定点的类型

2.4 点的大小

plot(x,y,cex) #使用cex指定大小的点绘制X、Y。cex的默认值为1。cex设得越小,点就按比例缩小;
              #cex设得越大,点就按比例增大。

        例如:

plot(Ozone$V8, Ozone$V9, xlab = "Sandburg Temperature", ylab = "El Monte Temperature", 
    main = "Ozone", cex = .5)
图5 设置cex=0.5调整点的大小

2.5 颜色

        使用col指定的颜色绘制X、Y。参数col可以设置为颜色名称、RGB颜色值。将col设置为颜色名称时,只需使用colors()函数返回的颜色名(white、blue、black等)即可。使用RGB设置颜色时,要设置为RGB颜色值,格式为“#RRGGBB"。

plot(x,y,col) 

        例如:

plot(Ozone$V8, Ozone$V9, xlab = "Sandburg Temperature", ylab = "El Monte Temperature", 
    main = "Ozone", col="blue")
图6 使用col="blue"设置点的颜色

2.6 坐标轴的取值范围

plot(x,y,xlim,ylim)  #在指定的坐标范围内绘制X、Y,设置的格式为c(最小值,最大值) 

        例如:

plot(Ozone$V8, Ozone$V9, xlab = "Sandburg Temperature", ylab = "El Monte Temperature", 
    main = "Ozone", xlim = c(0,100), ylim = c(0,90))
图7 使用xlim、ylim设置X轴、Y轴的取消范围

2.7 图像类型

        根据type指定的图形类型绘制X、Y。设置type时常用的值有p(点)、l(线)、b(点线)、o(点线重叠绘制)、n(不绘制)。同时使用点与线时,选项b与o作用类似。但使用b选项时,点与线相遇处只显示点或线之一。而使用o选项时,会先绘制点图,再在其上重叠绘制线图。使用n选项将不绘制数据,用于初始化新图形。使用n选项时,一般使用lines()、points()等函数绘制数据。

plot(x,y,type) 

        若想同时绘出点与线,可以设置type=“b”;若想重叠(overlapped)绘制点与线,设置type="o”。这两种点线图类似,它们都绘制点与线,但不同之处在于,使用b选项时,点与线相遇时不重叠;而使用o选项时,先绘制点图,然后在其上重叠绘制折线图,如下所示。

data("cars")
plot(cars)
plot(cars, type="l")
plot(cars, type="o")
plot(cars, type="b")

在这里插入图片描述

图8 使用type设置图形类型

        如图8所示,同一行驶速度往往可能对应2个以上的制动距离,可以使用tapply()函数针对每个speed求dist的平均值,然后使用plot()函数绘制数据图形。

plot(tapply(cars$dist, cars$speed, mean), type = "o", cex = 0.5, 
     xlab = "speed",ylab = "dist")
图9 各行驶速度下的平均制动距离

2.8 线型

        使用Ity指定的线型绘制X、Y。可以将lty设置为数字或字符串。设置为数字时,0表示不绘制、1表示实线(默认值)、2表示连字符(-)、3表示点、4表示点与连字符、5表示长连字符、6表示双连字符。也可以设置为字符串,以上线型对应的名称依次为blank、solid、dashed、dotted、dotdash、longdash、twodash。

plot(cars,type="l",lty="dashed")
图10 使用Ity设置线型

2.9 图形排列

        采用par()函数可以将图形绘制到同一个窗口。

par(mfrow=c(nr,nc))  #以nr行、nc列排列图形

        例如:

opar <- par(mfrow=c(1,2))
plot (Ozone$V8, Ozone$V9, xlab="Sandburg Temperature", ylab="El Monte Temperature",
    main="Ozone")
plot (Ozone$V8, Ozone$V9, xlab="Sandburg Temperature", ylab="El Monte Temperature",    
    main="Ozone2")
par(opar)

在这里插入图片描述

图11 使用mfrow=c(1, 2)设置图形排列方式为1行2列

2.10 抖动

        抖动是指向数据值添加若干燥声的方法。通过向数据值添加噪声,使得数据值略微偏移,这样就能避免拥有相同数值的数据在图形中发生多次重叠。

jitter(
    x,    #待添加噪声的数值向量
    #  factor、amount用于设置噪声水平,一般不需要直接设置。
    #  使用help(jitter)命令查看设置噪声大小的公式
    factor=1,
    amount=NULL
)   #  返回值为已添加噪声的数值向量

        Ozone数据集中存在着相同值多次出现的情形,下面以Ozone数据集为例,学习如何向数据添加噪声。Ozone数据集的V6与V7列分别为洛杉矶国际机场的风速与湿度,但这2列的值都是自然数,所以经常出现拥有相同值的问题。比如,下面显示的部分数据中,第3行与第6行风速都为4,第4行与第5行风速都为3。

       下列示例中,第一次调用plot)函数绘制图形时使用原始数据,第二次调用plot()函数绘制图形时添加了噪声。如图12所示,添加噪声后,相同数据不再重叠,从图形中更容易掌握数据分布情况。

plot(Ozone$V6,Ozone$V7, xlab="Windspeed", ylab="Humidity", main="Ozone", pch=20, cex=.5)
plot(jitter(Ozone$V6),jitter(Ozone$V7), xlab="Windspeed", ylab="Humidity", main="Ozone",
    pch=20, cex=.5)

在这里插入图片描述

图12 添加噪声后绘制图形

3、基本图形

3.1 点

points(x,y)

        例如:

plot(iris$Sepal.Width,iris$Sepal.Length,cex=.5,pch=20,xlab="width",ylab="length",main="iris")
points(iris$Petal.Width,iris$Petal.Length,cex=.5,pch="+",col="#FF0000")
图13 使用points()绘制数据点
with(iris,{
    plot(NULL,xlim=c(0,5), ylim=c(0, 10),
        xlab="width",ylab="length",main="iris",type="n")
    points(Sepal.Width, Sepal.Length, cex=.5, pch=20)
    points(Petal.Width, Petal.Length, cex=.5, pch="+",col="#FF0000")
})
图14 使用points()绘制数据点
        设置type=“n”,采用渐进方法绘图,但麻烦的是,需要在最初调用plot()函数时设置合适的xlim、ylim。

3.2 折线

lines(x,y)

        例如:

x <- seq(0, 2*pi, 0.1)
y <- sin(x)
plot(x, y, cex=.5, col="red") 
lines(x,y)
图15 使用lines()函数绘制正弦函数

        除此之外,R还提供了多种非参数回归方法,比如lowess()、loess()、ksmooth()、smooth.spline()、earth()等。
        例如:

plot(cars)
lines(lowess(cars))
图16 向cars数据应用LOWESS并绘制拟合曲线

3.3 直线

        abline()函数用于在图形中绘制y=ax+b形式的直线、y=h形式的水平线,以及x=v形式的垂直线。

abline(
    # a、b表示直线y=a+bx的截距和矩阵
    a = NULL,
    b = NULL,
    h = NULL,  #绘制y=h形式的水平线
    v = NULL,  #绘制x=v形式的垂直线
    reg = NULL#绘制线性回归模型
    ...
)

        例如:

plot(cars, xlim=c(0,25))
abline(a=-5, b=3.5, col="red")
abline(h=mean(cars$dist),lty=2)
abline(v=mean(cars$speed),lty=2)
图17 cars数据与dist=-5+3.5×speed 近似度

3.4 曲线

curve(
    expr,      # 函数或表达式
    from=NULL, # 区间起点
    to=NULL    # 区间终点
)

        例如:

curve(sin,0,2*pi)
图18 使用curve()函数绘制正弦曲线

3.5 多边形

polygon(x,y)  

        例如:

m<-lm(dist ~ speed,data=cars)
p<-predict(m,interval="confidence")
x<-c(cars$speed,
     tail(cars$speed,1),
     rev(cars$speed),cars$speed[1])
y<-c(p[,"lwr"],
     tail(p[,"upr"],1),
     rev(p[,"upr"]),
     p[,"lwr"][1])
plot(cars)
abline(m)
polygon(x, y, col=rgb(.7,.7,.7,.5))
图19 cars数据的线性回归及置信区间

4、字符串

text (
    x,       # X坐标
    y=NULL,   # Y坐标
    labels=seq_along(x),  # 待显示的字符串
    # adj与pos选项用于设置文本位置,若不设置,
    # 则在给定坐标处准确输出字符串。
    # adj选项用于设置文本位置,可以设置值为0或1、长度为2的向量。
    # (0,0)表示坐标右上,(0,1)表示右下,(1,0)表示左上,
    # (1,1)表示左下。
    adj=NULL,
    # pos选项也用于设置字符串位置。同时设置pos与adj时,pos设置优先。
    #pos值为1,表示在坐标底部输出字符串,为2表示在左侧,为3表示在顶部,为4表示在右侧。
    pos=NULL,
    ...
)

        例如:

plot(4:6,4:6)
text(5,5,"X")
text(5,5,"00",adj=c(0,0))
text(5,5,"01",adj=c(0,1))
text(5,5,"10",adj=c(1,0))
text(5,5,"11",adj=c(1,1))
图20 使用adj选项调整文本显示位置
        text()函数中,若不指定labels值,则采用默认值seq_along(x)。seq_along(x)函数用于返回1、2、3、…、NROW(x)整数值。因此,若不指定labels,则在(x,y)坐标位置上根据数据顺序添加编号。下列示例中,在cars各数据点一侧显示数据编号。
图21 使用text()函数向cars

5、识别图形中的数据

        图形绘制完成后,调用identify()函数,鼠标光标会变成十字形。将十字形光标置于图形中特定的点上并单击,距离单击点最近的数据上就会显示标签。若想终止鼠标点击,只要关闭图形窗口即可。

identify(
     x,          #待识别点的x坐标
     y=NULL,     #待识别点的y坐标
     labels=seq_along(x),    #识别后,标签根据labe1s指定的值进行输出。
     ...
)

        例如:

plot(cars,cex=.5)
identify(cars$speed,cars$dist)
图22 在cars数据中识别数据

6、图例

legend(
    x, #X坐标。在x中使用bottomright、bottom、bottomleft、
       #left、toplef、top、topright、right、center关键字代替坐标,用于设置图例的显示位置。
    y=NULL,   # Y坐标
    legend,   # 待显示的图例
    ...
)

        例如:

plot(iris$Sepal.Width,iris$Sepal.Length,pch=20,xlab="width",ylab="length")
points(iris$Petal.Width, iris$Petal.Length,pch="+",col="#FF0000")
legend("topright",legend=c("Sepal", "Petal"), pch=c(20, 43),
    col=c("black", "red"),bg="gray")
图23 显示Sepal与Petal数据图例

7、绘制以矩阵形式给出的数据

        matplots()、matlines()、matpoints()这3个函数分别与plot()、lines()、points()函数类似,但区别在于,使用它们可以在图形中绘制以矩阵形式给出的数据。它们在函数的调用方式上并无太大差别,只是前3个函数的输入是矩阵。
        下面使用matplot()函数绘制cos(x)、sin(x)在[-2π,2π]区间上的图形。如下所示,先调用seq()函数在[-2π,2π]区间内产生x值。

x<-seq(-2*pi,2*pi,0.01)
y<-matrix(c(cos(x),sin(x)),ncol=2)
matplot(x,y,lty=c("solid","dashed"),cex=.2,type="l")
abline(h=0,v=0)
图24 调用matplot()函数绘制cos(x)与sin(x)图形

8、应用图形

8.1 箱线图

        箱线图是一种反映数据分布的图形,中间箱体显示第一下四分位数、中位数上四分位数。 向箱体左右或上下延展的线——又称“箱须”(whisker)——分别代表比“中位数-1.5×1QR”大的数据中的最小值(下边缘,lower whisker)、比“中位数+1.5×IQR”小的数据中的最大值(上边缘,upper whisker)。1QR(四分位差)是Inter Quartile Range的缩写,它是上四分位数与下四分位数的差。图形中显示的点是异常值(outlier),它们代表比下边缘小的数据,或者比上边缘大的数据。

boxplot(
    x    # 待绘制箱线图的数据
)
boxplot(
    formula,   # 形式为y ~ grp,其中y是待绘分布的值,grp是分组变量。
               # y ~ grp表示按照每个grp对y绘制箱线图。
    data=NULL, # 待应用公式的数据框(或列表)
    horizontal=FALSE,  #若为TRUE,则竖向绘制箱线图;若为FALSE,则横向绘制箱线图。
    #若为TRUE,则绘制槽口区间,代表中位数的一种置信区间。
    #设置notch=TRUE,绘制2个箱线图,若其槽口区间彼此不重叠,
    #则表示两组数的中位数彼此不同。
    notch=FALSE,
    ...
)
# 返回值为列表,保存stats(分布统计值)、n(保存各组观测值数量的向量)、conf(保存notch区间的矩阵)、
# out(异常值)、group(异常值所属分组)、names(保存各分组名称的向量)。

        例如:

boxplot(iris$Sepal.Width)
图25 为iris$Sepal.Width绘制箱线图
        借助boxplot()函数的返回值可以准确查看箱线图中的这些值。
(boxstats<-boxplot(iris$Sepal.Width))



ps:文章用于学习

[参考书目] 徐珉久,R语言与数据分析实战,2017

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值