查看原文
其他

将军笔记之绘图

2017-07-31 coco 生信菜鸟团
别放弃治疗,速速点蓝字关注我们

我无限的热爱着新的一日 / 今天的太阳 / 今天的马 / 今天的花楸树 / 使我健康 富足 / 拥有一生 / 从黎明到黄昏 / 阳光充足 / 胜过一切过去的诗 ——海子 《幸福一日》



本章主要关注那些可以帮助理解单个类别型或连续型变量的图形。

1. 条形图:

  • 条形图通过垂直或水平的条形展示类别型变量的频数分布。barplot(x),x是向量或矩阵;

  • 代码示例及解释如下:

因为要用到vcd包中的Arthritis数据集,所以先载入vcd包。此处提示在载入vcd包之前先要载入grid包,照做。(那个提示是告诉你R自动载入了grid包,不是要你载入grid包。好傻...)

Arthritis数据集的结构大体如图下半部分所示。

要对Arthritis数据集中的Improved变量做图。首先用table函数统计该分类变量中每一类的数量。所以从这里可以知道barplot()函数需要的是什么样的数据类型。

对counts做图。main选项添加图题,xlab选项添加横轴标题,ylab添加纵轴标题,horiz选项决定条是水平还是垂直。

  • 如果类别型变量是一个因子,则可以使用函数plot()完成(注意上面是barplot()函数,这里是plot()函数),不需要先使用table()函数加工:

做出来的图和上面是一样的:

  • 如果barplot()函数的参数是一个矩阵而不是向量,那么得到的就是堆叠条形图或分组条形图,看beside选项是TRUE还是FALSE:代码示例:

还是使用vcd包中的Arthritis数据集,还是先用table函数来统计各种类型的频数;

对counts数据做条形图。注意这里使用col选项来指定了行的颜色。另外注意legend选项和rownames函数的用法;做出来的图如下所示:注意横轴按列分成两条,按行堆叠。数据形状和图形对应还挺一致(都是三行两列)。

如果加上beside=TRUE,则不再是堆叠条形图,而是分组条形图:

代码跟上面几乎完全一样,只是选项里多了一个beside=TRUE,于是就变成了分组条形图(把不同数据放在旁边),如下图所示:

为什么这里不用指定legend颜色后面就要指定?

  • 条形图不仅可以用来展示频数,也可以用来展示均值中位数标准差什么的:

    • 首先用到两个变量:前者是为美国每个州做了地理分区,东部西部什么的,后者是每个州的一些统计数字。两个变量的数据结构如下图所示:

    • 先把两个数据结合到同一个数据框中,然后根据各州所处地区统计犯罪率均值,并根据均值按大小排序:

    • 画图并添加标题。注意这里有个names.arg选项,指定各条横轴名称。为什么这里要指定前面就不用指定?数据结构不一样。前面都有列名行名,而此处没有行名。表示各州区域的那一列不是行名,而是数据框中普通一列。注意体会这一点。另外,使用title()函数和使用main选项是等价的。

  • 使用cex.names选项减小标签字号;names.arg允许指定一个字符向量作为条形的标签名(上面用过,下面的是直接指定)

首先使用par(mar=c(5,8,4,2))指定边界大小,顺序下左上右(不是矩形么?怎么上下不一样,左右不一样???)(指定的是下左上右的留白。好傻啊...)

las=2旋转了条形的标签(las=2表示标签垂直于坐标轴)。微调后的图如下所示:

  • 棘状图,其实就是等高堆叠图。棘状图由vcd包中的spine()函数绘制,代码示例如下:

首先,绘制棘状图的函数spine()是vcd包里面带的,所以要是用spine()函数绘制棘状图,需要先载入vcd包;

其他就没什么可说的了。要注意一点的是,棘状图,肯定是对于大于等于2x2的数据表格才有意义,就跟堆砌条形图一样。所以用的时候注意一下数据类型。

2. 饼图:

  • pie(x,labels=y)

第一行,给出一个2*2的图阵;

第二三行,给出数据和对应的标签;

第四行画图。很简单,不多说;

第五行算了一下各个数据的百分比并用round四舍五入,第六行将其加工成标签;

第七行使用了百分比标签,并且添加了彩虹色,很简单;

要画3D饼图,要载入plotrix包。不知道explode选项是什么意思?倾角吗?

第一次把labels写错了。大意了。

最终四幅图如下所示。不知为啥,一模一样的代码,我做的图的标签字体大好多(第四幅图)用cex.names指定一下标签大小试试???

对表做饼图。

lbls3一行是自己做了个标签。其他没啥。

  • 扇形图(fan plot),一种同时展示相对数量和相互差异的方法。plotrix包中的fan.plot()函数画扇形图。

没啥可说的。

画出来的图如下所示。觉得以后用的机会不多。

多个扇形叠加,但是半径不一样,所有的扇形都能看到。德国最大,其次是UK,然后是US。角度反映相对大小。

3. 直方图:

hist(x)函数绘制直方图,展示一组连续变量在不同区间的数量。

par(mfrow=c(2,2))建立一个2*2的画板;

breaks=12表示将所有数据分为12组,其他没啥好说的。画出来的图就像下面这样:

freq=FALSE,表示Y轴不用频数,而用频率。其他没啥说的。

rug()函数产生轴须图,是数据的一维呈现。如果有很多相同的数据,可以rug(jitter(mtcars$mpg), amount=0.01)来使短线偏离一个小的随机值(±amount)(jitter()函数是什么意思?)

lines函数产生一条密度曲线,是一个核密度估计。(注意,核密度估计是0-1之间的数,所以在做柱状图的时候必须得用freq=FALSE,将纵轴设为频率。如果用频数的话,曲线与柱数量差别太大,无法正常显示核密度曲线)(绘制核密度曲线的核心明明是density()函数啊。density()函数生成了密度值,line()函数把它画了出来)

第四幅图加了一条正态曲线。xfit生成40个值,最小值是x的最小值,最大值是x的最大值;yfit则把xfit40个值转化为均值为x-bar,标准差为x标准差的分布值;第二个yfit中,h的本质是个列表,h$mids应该是各组的中间值,diff(h$mids[1:2])是中间值的前两个的差值,其实也就是组中值差距;组中值差值*正态分布值*长度,即将Z值再还原成了实际值尺度。应该就是这样。box()生成框。产生的图如下所示:

4. 核密度图:

  • 核密度估计是用于估计随机变量概率密度函数的一种非参数方法:plot(density(x)),x是一个数值向量。这样生成的图形是一个独立的图形,如果要向一幅已经存在的图形上叠加密度曲线,要使用lines函数:lines(denxity(x))

第一行不解释;

看来生成核密度曲线的核心是density(x)这个函数啊!plot,lines都是对它起作用的。

polygon()函数根据顶点的x坐标和y坐标(本例中有density函数提供)绘制多边形(填充曲线下面积)。

还添加了轴须图(这里为什么不用jitter了?还有rug函数也是往已有图形上添加图形元素)。效果如下:

  • 核密度曲线图可以用于比较组间差异。使用sm包中的sm.density.compare()函数可以向图形叠加两组或更多和密度图:sm.density.compare(x,factor),x是数值向量,factor是分组变量:

前三行不解释

该行将cyl变量转变为因子,而且是分等级的,还指定了标签

sm一行的意思:比较mpg变量的核密度分布,根据cyl分组;

此时cyl.f的值是每个样本的气缸数(“4 cylinder”,“6 cylinder”,“8 cylinder”),levels(cyl.f)返回三个层次(“4 cylinder”,“6 cylinder”,“8 cylinder”),但是不知道为什么要把变量colfill设置成2,3,4?哪里知道是这三种颜色(难道是从2开始排着用?1是白色)?

legend里面,第一个参数locator(1)表示用鼠标点击想让图例出现的位置,鼠标点击处为图例左上角;第二个参数是图例标签,是个字符向量;第三个参数指定填充颜色,效果如下图所示(已经添加的图例怎么去掉啊?...):为什么前面legend选项不用指定颜色这里需要?难道是因为前面是选项这里是函数???

5. 箱形图(也叫盒须图。这个名字更形象):

  • 绘制连续型变量的五数总括:最小值,下四分位数,中位数,上四分位数,最大值,还能显示出离群点(盒顶/底±1.5*IQR(四分位距,上下四分位数的差值)):boxplot(mtcars$mpg,main="Box plot", ylab="Miles per Gallon")生成下图:

函数boxplot.stats(x)会返回箱形图中涉及的5个值

  • 使用并列箱形图进行跨组比较:boxplot(formula,data=dataframe)。formula可以是y~A,会比较不同A下y的值。y~A*B则会比较A,B两两组合下y的值:

意思是:根据cly分层,比较不同cyl下mpg的分布。得到的图如下所示:

添加参数varwidth=TRUE将使箱子宽度与其样本大小的平方根成正比;horizontal=TRUE产生横的箱子。

  • 通过添加notch=TRUE可以得到含凹槽的箱线图。若两个箱的凹槽部分互不重叠,则表明它们的中位数有显著差异。

加了notch=TRUE后,箱形图有了凹槽。如下图所示。不知为啥,会有警告信息。

  • 为多个分组因子绘制箱形图:

先把两个用于分类的变量因子化。不解释。

到底什么时候用因子什么时候不用?

画箱形图的方法前面也说了,没啥好说的。值得注意的是X轴,标签似乎自动把两个分类变量结合好了。另外注意绘图窗口的宽度,如果窗口过窄,X轴标签是显示不全的,会自动不显示一些标签。

  • 小提琴图,是箱形图和核密度图的结合,可以使用vioplot包中的vioplot函数来绘制。载入vioplot包前需要先载入sm包。vioplot()函数绘图格式为:vioplot(x1,x2,...names=,col=),其中x1,x2表示要绘制的数值向量,names是小提琴图中标签的字符向量,col是一个为每幅小提琴图指定颜色的向量。实例如下:

导入vioplot包需要先导入sm包;

像格式中的一样,没啥说的。画出来的图是这个样子的:

小提琴图似乎只能指定一种颜色?我用 col=c("red","green","gold")得到的三个图都是红色而不是红绿黄三种颜色。

小提琴图中间白点是中位数,黑色块状区域是四分位数,黑线是须,表示最大最小值。外面的形状是核密度估计。

6. 点图:

  • 函数调用格式:dotchart(x,labels=),(这里特么又是chart不是plot了...能不能给条活路啊...)x是数值向量,labels是标签名构成的向量。可以用groups来选定一个因子,指定x中元素的分组方式,此时gcolor可以控制不同组标签的颜色,cex可控制标签大小。示例如下:

严格按格式来,没啥可说的。注意row.names(数据集名称)这个用法,表示取了数据集的行名称,别用错了。

做出来的图和书上给出的不一样,可能是因为版本的原因?书上没有虚横线。

  • 对点图排序并分组,不同组用不同符号和颜色表示:

首先对mtcars数据集根据mpg变量排序,赋值给变量x;然后把x中的cyl变量因子化;增加新变量color,变量值根据cyl确定。看能看懂,让你自己写你能不能写出来?

使用groups选项,数据点根据cyl变量值分组;gcolor控制不同组标签的颜色(gcolor控制的是组标签的颜色,就是那个4,6,8,而不是组内点的颜色。点的颜色是color选项控制的);color选项指定点和点标签的颜色(注意与gcolor表示的组标签相区别)。pch=19,表示点以填充的圆圈表示。得到的图如下所示:

没错,gcolor控制的是4,6,8这三个数字的颜色。在这张图中,每个点都有标签,每个点的值都有其内在含义,并且这些点是以便于比较的方式排列的。简直碉堡!但是随着点数的增多,点图的实用性随之下降。

画图函数小结:

  1. 小提琴图

vioplot::vioplot(x1, x2, x3, ... names='', col='')

x1, x2, x3是要做图的数据向量,names选项是数据标签,col指定颜色。小提琴图的不同数据只能使用同一种颜色。

  1. 点图:

dotchart(data, labels=, cex=, main='', groups=, gcolor='', color=)

groups是分组变量,gcolor是组标签颜色。color是颜色变量,事先对不同组指定了不同的color。

  1. 箱形图:

boxplot(data, main=, ylab=)

boxplot(y~A*b, data=dataframe, varwidth=TRUE, horizontal=TRUE, notch=TRUE, col=)

y~A*b,根据Ab两个变量的组合分组,看每组中y变量的分布。varwidth选项使箱子宽度与样本大小平方根成正比;

  1. 核密度图:

plot(density(x)) 生成独立的核密度图。density()计算核密度曲线值,plot()画图;

lines(density(x))向已有图形上添加核密度图;

polygon(density(d), col=, border=)填充曲线下面积;

sm::sm.density.compare(data, group=, xlab=) data,待绘制变量;group,分组变量。

  1. 扇形图:

plotrix::fan.plot(data,labels=, main=)

  1. 直方图:

hist(data, breaks=12, col=, xlab=, main=, freq=TRUE)

freq=FALSE表示y轴不用频数而用频率;breaks指定分组数;

rug(jitter(data)) 在直方图下画轴须图;

lines(density(data),col=, lwd=) 在直方图上画核密度图。画核密度图时,freq必须为FALSE,即必须使用频率,只有这样直方图高度和核密度曲线高度才在同一量级上。

  1. 条形图:

barplot(data, main=, xlab=, ylab=, horiz=TRUE, clo=c(), legend=rownames(), beside=TRUE, names.arg=, cex.names=)

beside=TRUE时,改堆叠条形图为并排放置的条形图;names.arg用于没有行名时指定数据标签;cex.names为浮点数,指定图题大小;

  1. 棘状图:

vcd::spine(data, main=)

就是等高的堆叠条形图。

  1. 饼图:

pie(data, labels=, main=, col=rainbow(length(labels)))

注意指定颜色的方法,各函数的配合使用;

plotrix::pie3D(data, labels=, explode=, main=)






您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存