ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

R语言

2021-02-27 20:30:36  阅读:264  来源: 互联网

标签:线图 语言 mtcars 标签 条形图 绘制 向量


基本图形

本篇文章主要参考了《R语言实战》1这本书。做了一些简化,是笔者学习的笔记,总结,书中例子复现。侵删。

条形图

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

简单条形图

若height是一个向量,则它的值就确定了各条形的高度,并将绘制一幅垂直的条形图。使 用选项horiz=TRUE则会生成一幅水平条形图。你也可以添加标注选项。选项main可添加一个图 形标题,而选项xlab和ylab则会分别添加x轴和y轴标签。

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

None   Some Marked 
    42     14     28 

你可以使用一幅垂直或水平的条形图来绘制变量counts。

barplot(counts,main = "Simple Bar Plot",xlab = "Improved",ylab = "Frequency")
#绘制简单条形图
barplot(counts,main = "Horizontal Bar Plot",xlab = "Frequency",ylab = "Improved",horiz = TRUE)
#绘制水平条形图

在这里插入图片描述

堆砌条形图和分组条形图

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

library(vcd)
counts<-table(Arthritis$Improved,Arthritis$Treatment)
counts
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)#分组条形图

第一个barplot函数绘制了一幅堆砌条形图,而第二个绘制了一幅分组条形图。我们同时使 用col选项为绘制的条形添加了颜色。参数legend.text为图例提供了各条形的标签(仅在 height为一个矩阵时有用)。

在这里插入图片描述

均值条形图

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

states<-data.frame(state.region,state.x77)
means<-aggregate(states$Illiteracy,
                 by=list(state.region),
                 FUN=mean)
means

	        Group.1        x
1     Northeast 1.000000
2         South 1.737500
3 North Central 0.700000
4          West 1.023077

means<-means[order(means$x),]#将均值从小到大排序
means

   Group.1        x
3 North Central 0.700000
1     Northeast 1.000000
4          West 1.023077
2         South 1.737500

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

在这里插入图片描述

条形图的微调

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

par(mar=c(5,8,4,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 Improved",
        "Marked Improvement"))

在这里插入图片描述

我们(使用las=2)旋转了条形的标签、修改了标签文本,并(使用mar)增加了y 边界的大小,为了让标签更合适,(使用cex.names=0.8)缩小了字体大小。par()函数能够让 你对R的默认图形做出大量修改。

棘状图

棘状图对堆砌条形图进行了重缩放,这样每个条形的高度均为1,每一段的高度即 表示比例。棘状图可由vcd包中的函数spine()绘制。以下代码可以生成一幅简单的棘状图:

library(vcd)
attach(Arthritis)
counts<-table(Treatment,Improved)
spine(counts,main = "Spinogram Example")
detach(Arthritis)

在这里插入图片描述

治疗组同安慰剂组相比,获得显著改善的患者比例明显更高。

饼图

饼图可由以下函数创建:

pie(x,labels)

其中x是一个非负数值向量,表示每个扇形的面积,而labels则是表示各扇形标签的字符型向量。

par(mfrow=c(2,2))
slices<-c(10,12,4,16,8)
#将四幅图行组合为一幅
lbls<-c("US","UK","Australa","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")
#rainbow定义各扇的颜色
library(plotrix)#用这个包中的pie3d花三维饼图
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)")

在这里插入图片描述

library(plotrix)
slices<-c(10,12,4,16,8)
#将四幅图行组合为一幅
lbls<-c("US","UK","Australa","Germany","France")
fan.plot(slices,labels = lbls,main = "Fan Plot")

直方图

直方图通过在X 轴上将值域分割为一定数量的组,在Y 轴上显示相应值的频数,展示了连续 型变量的分布。可以使用如下函数创建直方图:

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,
     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 wih 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()

在这里插入图片描述

核密度

核密度估计是用于估计随机变 量概率密度函数的一种非参数方法。

plot(density(x))

其中的x是一个数值型向量。由于plot()函数会创建一幅新的图形,所以要向一幅已经存在的图 形上叠加一条密度曲线,可以使用lines()函数。

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

在这里插入图片描述

在第一幅图中,你看到的是完全使用默认设置创建的最简图形。在第二幅图中,你添加了一 个标题,将曲线修改为蓝色,使用实心红色填充了曲线下方的区域,并添加了棕色的轴须图。 polygon()函数根据顶点的x和y坐标(本例中由density()函数提供)绘制了多边形。

par(lwd=2)#双倍线条宽度
library(sm)
attach(mtcars)
#创建分子因子
cyl.f<-factor(cyl,levels = c(4,6,8),
              labels = c("4 cylinder","6 cyclinder",
                         "8 cyclinder"))
#创建密度图
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(cy1.f),fill = colfill)

detach(mtcars)

在这里插入图片描述

箱线图

箱线图(又称盒须图)通过绘制连续型变量的五数总括,即最小值、下四分位数(第25百分 位数)、中位数(第50百分位数)、上四分位数(第75百分位数)以及最大值,描述了连续型变量 的分布。箱线图能够显示出可能为离群点(范围±1.5*IQR以外的值,IQR表示四分位距,即上 四分位数与下四分位数的差值)的观测。

boxplot(mtcars$mpg,main="Box plot",ylab="Miles per Gallon")

在这里插入图片描述

使用并列箱线图进行跨组比较

箱线图可以展示单个变量或分组变量。使用格式为:

boxplot(formula,data=dataframe)

其中的formula是一个公式,dataframe代表提供数据的数据框(或列表)。一个示例公式为y ~ A,这将为类别型变量A的每个值并列地生成数值型变量y的箱线图。公式y ~ A*B则将为类别型 变量A和B所有水平的两两组合生成数值型变量y的箱线图。 添加参数varwidth=TRUE将使箱线图的宽度与其样本大小的平方根成正比。参数 horizontal=TRUE可以反转坐标轴的方向。

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

在这里插入图片描述

箱线图灵活多变,通过添加notch=TRUE,可以得到含凹槽的箱线图。

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

在这里插入图片描述

两个交叉因子的箱线图

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

在这里插入图片描述

小提琴图

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

在这里插入图片描述
在图中,白点是中位数,黑色盒 型的范围是下四分位点到上四分位点,细黑线表示须。外部形状即为核密度估计。

点图

你可以使用dotchart()函数 创建点图,格式为: 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")

在这里插入图片描述

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

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"
dotchart(x$mpg,
         labels = row.names(x),
         cex = .7,
         groups = x$cyl,
         gcolor = "black",
         color = x$color,
         pch=19,
         main = "Gas Mileaga for Car Models\ngrouped by cylinder",
         xlab = "Miles Per Gallon")

在这里插入图片描述


  1. R语言实战 [美] Robert I. Kabacoff ↩︎

标签:线图,语言,mtcars,标签,条形图,绘制,向量
来源: https://blog.csdn.net/weixin_47185558/article/details/114189896

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有