R语言第六章——基本图形(多图)

本章内容

条形图、箱线图和点图
饼图和扇形图
直方图与核密度图

</br>

6.1条形图(Simple Bar Plot简单条形图)(Horizontal Bar Plot水平条形图)

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

01简单条形图(height 是一个向量时)

示例如下:

>install.packages("vcd")#安装vcd包
> library(vcd)#载入包
> counts<-table(Arthritis$Improved)#提取样本中改善的量
> counts#输出结果
  None   Some Marked 
    42     14     28 
> 
> barplot(counts,
+         main = "Simple Bar Plot",
+         xlab = "Improvement",ylab = "Frequency")#绘制简单条形图
简单条形图
> barplot(counts,
+         main = "Horizontal Bar Plot",
+         xlab = "Frequency",ylab = "Improvement", col = c("red","yellow","green"),
+         horiz = TRUE)#绘制水平条形图,horiz = TRUE表示水平绘制,使用col添加颜色
水平条形图添加颜色后
02堆砌条形图和分组条形图(height 是一个矩阵时)
> library(vcd)
> counts<-table(Arthritis$Improved,Arthritis$Treatment)#选取治疗类型和改善情况
> counts#输出结果
        
         Placebo Treated
  None        29      13
  Some         7       7
  Marked       7      21
> 
> 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)#绘制分组条形图
分组条形图

参数legend.text为图例提供了各条形的标签(仅在height为一个矩阵时有用)。
beside=FALSE(默认值),若beside=TRUE,则矩阵中的每一列都表示一个分组,各列中的值将并列而不是堆砌。

由于标签和图形重叠,影响美观和观测,所以回看第三章相关内容,改进如下:
legend("topright",legend=c("None","Some","Marked"),fill=c("red","yellow","green"))
但是效果还不是很理想。

03均值条形图

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

> options(digits = 3)
> states<-data.frame(state.region,state.x77)
> means<-aggregate(states$Illiteracy,by=list(state.region),FUN=mean)
> means
        Group.1    x
1     Northeast 1.00
2         South 1.74
3 North Central 0.70
4          West 1.02
> 
> means<-means[order(means$x),]#将均值从小到大进行排序
> means
        Group.1    x
3 North Central 0.70
1     Northeast 1.00
4          West 1.02
2         South 1.74
> 
> barplot(means$x,names.arg = means$Group.1)
> title("Mean Illiteracy Rate")#添加标题
>#缺失一个标签,不知道为何?
美国各地区平均文盲率排序的条形图
lines(means$x,type = "b",pch=17,lty=2,col="red")#加入代码添加线条
均值条形图加入线条
04条形图的微调

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

> 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",
+                       "Markde Improvement"))#修改标签文本
微调了标签的垂直条形图
05 棘状图
> library(vcd)
> attach(Arthritis)
The following object is masked _by_ .GlobalEnv:

    ID

> counts <- table(Treatment, Improved)
> spine(counts, main="Spinogram Example")
> detach(Arthritis)
> 
关节炎治疗结果的棘状图
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 = "")#标签内容
> #有5种颜色的饼图
> pie(slices,labels = lbls2,col = rainbow(length(lbls2)),
+     main = "Pie Chart with Percentages")
> #生成3D饼图
> library(plotrix)
> pie3D(slices,labels=lbls,explode=0.1,
+       main="3D Pie Chat ")
> #从表格创建饼图
> 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)")
>
饼图示例

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

> 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,#指定为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 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()
直方图复杂
6.4核密度图

绘制密度图的方法(不叠加到另一幅图上方)为: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")#添加棕色的轴须图
核密度图.
> library(sm)
> attach(mtcars)
> #创建分组因子。
> cyl.f<-factor(cyl,levels = c(4,6,8),
+               labels = c("4 cylinder","6 cylinder",
+                          "8 cylinder"))#变量 cyl 是一个以4、6或8编码的数值型变量。
> #为了向图形提供值的标签,这里 cyl 转换为名为 cyl.f 的因子。
> 
> 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)
按汽缸个数划分的各车型每加仑汽油行驶英里数的核密度图.
6.5箱线图

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

> #生成箱线图
> boxplot(mtcars$mpg,main="Box plot",ylab="Miles per Gallon")
> boxplot.stats(mtcars$mpg)
$stats
[1] 10.40 15.35 19.20 22.80 33.90

$n
[1] 32

$conf
[1] 17.11916 21.28084

$out
numeric(0)
生成简单箱线图,手动添加
01使用并列箱线图进行跨组比较

箱线图可以展示单个变量或分组变量。使用格式为:oxplot(formula,data=dataframe)

其中的formula是一个公式,dataframe代表提供数据的数据框(或列表)。

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

#为每个气缸生成每加仑行驶的英里数箱线图
> boxplot(mpg~cyl,data = mtcars,
+         main="Car Mileage Data",
+         xlab="Number of Cylinders",
+         ylab="Miles per Gallom")
不同汽缸数量车型油耗的箱线图.
> #添加notch=TRUE生成含凹槽的箱线图
> boxplot(mpg~cyl,data = mtcars,
+         notch=TRUE,
+         varwidth=TRUE,
+         col="red",
+         main="Car Mileage Data",
+         xlab="Number of Cylinders",
+         ylab="Miles Per Gallon")
Warning message:
In bxp(list(stats = c(21.4, 22.8, 26, 30.4, 33.9, 17.8, 18.65, 19.7,  :
  一些槽在折叶点外('box'): 可能是因为notch=FALSE
不同汽缸数量车型油耗的含凹槽箱线图
#两个交叉因子的箱线图
> #创建气缸数量因子
> 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,
+         col=c("gold","darkgreen"),
+         main="MPG Distribution by Atuo Type",
+         xlab="Atuo Type",
+         ylab="Miles Per Gallon")
不同变速箱类型和汽缸数量车型的箱线图

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

</br>

02小提琴图

使用vioplot包中的vioplot()函数绘制它。请在第一次使用之前安装vioplot包。
vioplot()函数的使用格式为:vioplot(x1,x2,...,names=,col=)
其中x1,x2,...表示要绘制的一个或多个数值向量(将为每个向量绘制一幅小提琴图)。参数names是小提琴图中标签的字符向量,而col是一个为每幅小提琴图指定颜色的向量。

> install.packages("vioplot")
> library(vioplot)
Warning message:
程辑包‘vioplot’是用R版本3.3.3 来建造的 
> 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")
汽缸数量和每加仑汽油行驶英里数的小提琴图

(小提琴图真的很漂亮)

在图中,白点是中位数,黑色盒型的范围是下四分位点到上四分位点,细黑线表示须。外部形状即为核密度估计。
</br>

6.6点图

点图提供了一种在简单水平刻度上绘制大量有标签值的方法。

你可以使用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")
每种车型每加仑汽油行驶英里数的点图
> #各车型依汽缸数量分组的每加仑汽油行驶英里数点图,分组排序后的点图
> #根据每加仑汽油行驶英里数(从最低到最高)
> #对数据框 mtcars 进行排序,结果保存为数据框 x
> x<-mtcars[order(mtcars$mpg),]
> #将数值向量 cyl 转换为一个因子  
> x$cyl<-factor(x$cyl)
> #添加一个字符型向量 ( color )到数
> #据框 x 中,根据 cyl 的值,它所含的值
> #为 "red" 、 "blue" 或 "darkgreen"
> 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",#数字4、6、8显示为黑色
+ color=x$color,#点和标签的颜色
+ pch=19,
+ main="Gas Mileage for Car Models\ngrouped by cylinder",
+ xlab="Mlies Per Gallon")

各车型依汽缸数量分组的每加仑汽油行驶英里数点图

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

</br>

本章小结

  1. 学会了使用条形图和饼图了解类别型变量的分布,以及通过堆砌条形图和分组条形图理解不同类别型输出的组间差异。
  2. 探索了直方图、核密度图、箱线图、轴须图以及点图可视化连续型变量分布的方式。
  3. 了解了密度图、并列箱线图和分组点图可视化连续型输出变量组间差异的方法。

对单个变量(数值型变量和类别型变量)的可视化方法有了一定的认识和掌握,通过各种常用图形的绘制,加深了理解单个变量的分布和意义,有利于后续多变量统计方法的学习。
重点是熟悉并掌握各类图形的应用场景、使用函数,以及相关的绘图函数应用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容