R语言之可视化1

目录

简单的条形图

堆砌/水平条形图:(两个变量,二维)

均值条形图

条形图的微调

饼图

为饼图添加比例数值:

三维饼图:

从表格中创建饼图

扇形图

直方图

简单直方图:只需一条代码

指定组数和颜色的直方图

添加轴须图的直方图:

添加正态密度曲线和外框的直方图:

核密度图

最简单的核密度图:

高级一点的核密度图:

可比较的核密度图:

箱线图

单分组因子箱线图---->一个自变量:cyl

两个交叉因子的箱线图---->两个自变量:cyl,am

小提琴图

点图

分组、排序、着色后的点图


导入vcd包,不过暂时不用它画图,我们只是需要vcd包中的Arthritis数据集

简单的条形图

条形图通过垂直的或水平的条形展示了类别型变量的分布(频数),函数barplot ()的最简单用法是:
barplot (height),其中的height是一个向量或一个矩阵。

向量

载入我们要用到的数据,在关节炎研究中,变量Improved记录了对每位接受了安慰剂或药物治疗的病人的治疗结果:

library(vcd)
counts<-table(Arthritis$Improved)
counts

用选项horiz=TRUE则会生成一幅水平条形图,选项main可添加一个图形标题,而选项xlab和ylab则会分别添加x轴和y轴标签。

barplot(counts,
        main="Simple Bar Plot",
        xlab="Improvement",
        ylab="Frequency")
#水平
barplot(counts,
        main="Horizontal Bar Plot",
        xlab="Improvement",
        ylab="Frequency",
        horiz=TRUE)

若要绘制的类别型变量是一个因子或有序型因子,就可以使用函数plot()快速创建一幅垂直条形图。由于Arthritis$ Improved是一个因子,所以代码无需使用table()函数将其表格化。

 矩阵

如果height是一个矩阵,则绘图结果将是一幅堆砌条形图或分组条形图,若beside=FALSE (默认值),则矩阵中的每一列都将生成图中的一个条形,各列中的值将给出堆砌的“子条”的高度。若beside=TRUE, 则矩阵中的每一列都表示一个分组, 各列中的值将并列而不是堆砌。

载入数据:

counts<-table(Arthritis$Improved,Arthritis$Treatment)
counts

堆砌/水平条形图:(两个变量,二维)

barplot(counts,
        main="Stacked Bar Plot",  #main="Grouped Bar Plot"
        xlab="Treatment",
        ylab="Frequency",
        col=c("red","yellow","green"),
        legend=rownames(counts),
#水平    besides=TRUE)

 

均值条形图

条形图并不一定要基于计数数据或频率数据。你可以使用数据整合函数并将结果传递给barplot ()函数,来创建表示均值、中位数、标准差等的条形图。

计算均值:

aggregate()汇总函数,state$Illiteracy根据文盲率这个变量,by分组,state.region根据地区分组,FUN=mean汇总函数求平均

#数据框通过函数data.frame()创建
states <- data.frame(state.region,state.x77)
means <- aggregate(states$Illiteracy, by=list(state.region), FUN=mean)
means

 

将均值从小到大排序:

means <- means[order(means$x),]   # #对行标签对象x排序
means

排序后均值的条形图:

第一个参数mean$x是画图的对象,第二个参数names.arg是绘制在每个条形或条形组下面的名称的向量。如果省略了这个参数,那么说明这是一个矢量,名字将从height的名字属性中提取,如果是一个矩阵,则从列名中提取。

barplot(means$x,names.arg=means$Group.1)
title("Mean Illiteracy Rate")   #添加标题

means$x是包含各条形高度的向量,而添加选项names . arg=means$Group.1是为了展示标签。

条形图的微调

有若干种方式可以微调条形图的外观。例如,随着条数的增多,条形的标签可能会开始重叠。你可以使用参数cex . names来减小字号。将其指定为小于1的值可以缩小标签的大小。可选的参数names . arg允许你指定一个字符向量作为条形的标签名。你同样可以使用图形参数辅助调整文本间隔。

par()函数可以让你对R的默认图形做出大量修改

par(mar=c(5,8,4,2))  #增加y边界的大小
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"))  #修改标签文本
 

 

饼图

饼图可由以下函数创建:     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")

 

为饼图添加比例数值:

将样本数转换为比例值,并将这项信息添加到了各扇形的标签上。并使用rainbow()函数定义了各扇形的颜色。这里的rainbow(length(lbls2) )将被解析为rainbow(5),即为图形提供了五种颜色。

paste:连接字符串函数,第一个参数lbls是连接的对象,第二个参数是空格,第三个参数是百分比,第四个参数是连接符号%,第五个参数是分隔符sep 

pct <- round(slices/sum(slices)*100)
lbls2 <- paste(lbls," ", pct,"%",sep="")
pie(slices,
    labels=lbls2,
    col=rainbow(length(lbls2)),
    main="Pie Chart with Percentages")

 

三维饼图:

使用plotrix包中的pie3D()函数创建的三维饼图

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)")

 

 

 但是,饼图让比较各扇形的值变得困难( 除非这些值被附加在标签上),为此,我们创造了一种称为扇形图( fan plot )的饼图变种。扇形图提供了一种同时展示相对数量和相互差异的方法。

 

扇形图

在R中,扇形图是通过plotrix包中的fan.plot ()函数实现的

slices <- c(10,12,4,16,8)
lbls <- c("US","UK","Australia","Germany","France")
fan.plot(slices,
         labels=lbls,
         main="Fan Plot")

 

直方图

直方图通过在x轴上将值域分割为一定数量的组,在y轴上显示相应值的频数,展示了连续型变量的分布。可以使用如下函数创建直方图:  hist (x)
其中的x是一个由数据值组成的数值向量,参数freq=FALSE表示根据概率密度而不是频数绘制图形,参数breaks用于控制组的数量。在定义直方图中的单元时,默认将生成等距切分。

 

简单直方图:只需一条代码

hist (mtcars$mpg)   #选用mtcars数据集

 

指定组数和颜色的直方图

hist (mtcars$mpg,
      breaks=12,
      col="pink",
      xlab="Miles Per Gallon",
      main="Colored histogram with 12 bins")

 

添加轴须图的直方图:

我们仍旧保留上一幅图中的颜色、组数、标签和标题设置,又叠加了一条密度曲线和轴须图( rug plot )。这条密度曲线是一个核密度估计,它为数据的分布提供了一种更加平滑的描述。我们使用1 ines ()函数叠加了这条蓝色、双倍默认线条宽度的曲线。最后,轴须图是实际数据值的一种一维呈现方式。如果数据中有许多结”,你可以使用如下代码将轴须图的数据打散:
rug (jitter (mtcars$mpag,amount=0.01) )
这样将向每个数据点添加一个小的随机值(一个\pmamount之间的均匀分布随机数),以避免重叠的点产生影响。

hist (mtcars$mpg,
      freq=FALSE,
      breaks=12,
      col="pink",
      xlab="Miles Per Gallon",
      main="Histogram,rug plot, density curve")
rug(jitter(mtcars$mpg))      #轴须图,下方一个个黑色的短线
lines(density(mtcars$mpg),   #密度曲线
      col="blue",
      lwd=2)

lwd:线条宽度,lty=1:设置为实线,lty=2:设置为虚线 

添加正态密度曲线和外框的直方图:

x <- mtcars$mpg
h <- hist(x,
          breaks=12,
          col="pink",
          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)  # lwd: 线条宽度
box()   #生成一个将图形围起来的盒型

 

核密度图

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

最简单的核密度图:

d <- density(mtcars$mpg)
plot(d)

 

高级一点的核密度图:

polygon()函数根据顶点的x和y坐标(本例中由density()函数提供)绘制了多边形。
核密度图可用于比较组间差异。可能是由于普遍缺乏方便好用的软件,这种方法其实完全没
有被充分利用。幸运的是,sm包漂亮地填补了这一缺口。使用sm包中的sm.density.compare ()函数可向图形叠加两组或更多的核密度图。使用格式为:
sm.density.compare(x, factor)
其中的x是一个数值型向量,factor是一个分组变量。 请在第一次使用sm包之前安装它。代码中的示例,比较了拥有4个、6个或8个汽缸车型的每加仑汽油行驶英里数。
 

plot(d,
     main="Kernel Density of Miles Per Gallon")
polygon(d,
        col="yellow",  #曲线设为红色,并用黄色填充
        border="red")
rug(mtcars$mpg,    #添加黑色的轴须图
    col="black")

可比较的核密度图:

首先载人sm包,并绑定数据框mtcars。在数据框mtcars中,变量cy1是一个以4、6或8编码的数值型变量。为了向图形提供值的标签,这里cy1转换为名为cy1.f的因子。title()语句添加标题,与在plot中的main等价,这里的colfill值为c(2,3,4), 然后通过legend() 函数添加一个图例。第一个参数值locator (1)表示用鼠标点击想让图例出现的位置来交互式地放置这个图例。第二个参数值则是由标签组成的字符向量。第三个参数值使用向量colfill为cyl.f 的每一个水平指定了一种颜色。

核密度图的叠加不失为一种在某个结果变量上跨组比较观测的强大方法。你可以看到不同组所含值的分布形状,以及不同组之间的重叠程度。

#载入数据
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('topright',levels(cyl.f),fill=colfill)   # topright也可用locator(1)代替,添加图例到鼠标点击的位置

detach(mtcars)

locator(1)     #在图上点一下就出现图例 

 

箱线图

箱线图(又称盒须图),通过绘制连续型变量的五数总括,即最小值、下四分位数(第25百分位数)、中位数(第50百分位数)、上四分位数(第75百分位数)以及最大值。描述了连续型变量的分布。箱线图能够显示出可能为离群点(范围+1.5*IQR以外的值,IQR表示四分位距,即上四分位数与下四分位数的差值)的观测。函数表示:
boxplot (mtcars$mpg,main="Box plot", ylab="Miles per Gallon")
为了图解各个组成部分,手工添加了标注

单分组因子箱线图---->一个自变量:cyl

箱线图可以展示单个变量或分组变量。使用格式为:boxplot ( formula, data=dataframe)
其中,formula是一个公式,dataframe代表提供数据的数据框(或列表)。

示例公式为y ~A,将为类别型变量A的每个值并列地生成数值型变量y的箱线图。

公式y ~ A*B则将为类别型变量A和B所有水平的两两组合生成数值型变量y的箱线图。

参数horizontal=TRUE可以反转坐标轴的方向。在以下代码中,我们使用并列箱线图重新研究了四缸、六缸、八缸发动机对每加仑汽油行驶的英里数的影响。

boxplot(mpg ~ cyl,
        data=mtcars,
        main="Car Mileage Data",
        xlab="Number of Cylinders0",
        ylab="Miles Per Gallon")

在图中可以看到不同组间油耗的区别非常明显。同时也可以发现,六缸车型的每加仑汽油行驶的英里数分布较其他两类车型更为均匀,四缸车型的每加仑汽油行驶的英里数散布最广(且正偏),在八缸组还有一个离群点。

通过添加notch=TRUE,可以得到含凹槽的箱线图。若两个箱的凹槽互不重叠,则表明它们的中位数有显著差异。添加参数varwidth=TRUE将使箱线图的宽度与其样本大小的平方根成正比。
 

boxplot(mpg ~ cyl,
        data=mtcars,
        notch=TRUE,
        varwidth=TRUE,
        col="red",
        main="Car Mileage Data",
        xlab="Number of Cylinders0",
        ylab="Miles Per Gallon")

可以看到,四缸、六缸、八缸车型的油耗中位数是不同的。随着汽缸数的减少,油耗明显降低。

两个交叉因子的箱线图---->两个自变量:cyl,am

cyl表示汽车的缸数,am表示汽车是自动挡还是手动挡

#创建气缸数量的因子
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","standaard"))
#绘制箱线图
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")

 图清晰地显示出油耗随着缸数的下降而减少。对于四缸和六缸车型,标准变速箱的油耗更高。但是对于八缸车型,油耗似乎没有差别。你也可以从箱线图的宽度看出。

 

小提琴图

小提琴图是箱线图与核密度图的结合,你可以使用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")

小提琴图基本上是核密度图以镜像方式在箱线图上的叠加。在图中,白点是中位数,黑色盒型的范围是下四分位点到上四分位点,细黑线表示须,外部形状即为核密度估计。

点图

点图提供了一种在简单水平刻度上绘制大量有标签值的方法。你可以使用dotchart ()函数创建点图,格式为:  dotchart(x,labels= )
其中的x是一个数值向量,而labels则是由每个点的标签组成的向量。你可以通过添加参数groups来选定一个因子,用以指定x中元素的分组方式。如果这样做,则参数gcolor可以控制不同组标签的颜色,cex可以控制标签的大小。这里是mtcars数据集的一个示例:

dotchart(mtcars$mpg,
         labels=row.names(mtcars), 
         cex=1.2,
         main="Gas Mileage for Car Models",
         xlab="Miles Per Gallon")

分组、排序、着色后的点图

x <- mtcars[order(mtcars$mpg),]  #根据每加仑汽油行驶英里数(从最低到最高)对数据框mtcars进行排序,结果保存为数据框x

x$cyl <- factor(x$cyl)  #将数值向量cy1转换为一个因子

x$color[x$cyl==4] <- "red"
x$color[x$cyl==6] <- "blue"
x$color[x$cyl==8] <- "darkgreen"
dotchart(x$mpg,
         labels=row.names(x),   #各数据点的标签取自数据框的行名(车辆型号)
         cex=1.2,
         groups=x$cyl,    #数据点根据气缸数量分组
         gcolor="black",  #数字颜色
         color=x$color,   #点和标签的颜色
         pch=19,          #设置显示为实心圆点
         main="Gas Mileage for Car Models",
         xlab="Miles Per Gallon")

 

从图中再次看到,随着汽缸数的减少,每加仑汽油行驶的英里数有了增加。但你同时也看到了例外。例如, Pontiac Firebird有8个汽缸,但较六缸的Mercury280C和Valiant的行驶英里数更多。六缸的Hornet 4 Drive与四缸的Volvo 142E的每加仑汽油行驶英里数相同。同样明显的是,Toyota Corolla的油耗最低,而Lincoln Continental和Cadillac Fleetwood是英里数较低一端的离群点。

pch决定点的样式,关于pch的取值有以下几种:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值