每个样品的R条形图标签大小

jin*_*nni 2 plot r

我想按其大小(即该组中数据框中的观察值的数量)在条形图中标记每个框。

例如,如果第一个变量具有3个级别,第二个变量具有4个级别,那么我想要12个标签。

(也可以控制这些标签的大小或位置)

感谢您的任何帮助。

mat*_*fee 5

这是一种实现方法,以数据VADeaths为例(默认情况下,它将在您的R工作区中;如果没有,则使用library(datasets))。

bar <- barplot(VADeaths)
text(rep(bar,each=nrow(VADeaths)), as.vector(apply(VADeaths,2,cumsum)), 
     labels=as.vector(apply(VADeaths,2,cumsum)),pos=3)
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

在此处输入图片说明

要修改字体的大小,可以使用text(...,cex=2)使字体大小变为原来的两倍的方法,例如

现在,让我们解释一下此代码,以便您自己知道如何做!

首先,让我们看一下VADeaths:这是每个年龄段的死亡人数统计:

> VADeaths
      Rural Male Rural Female Urban Male Urban Female
50-54       11.7          8.7       15.4          8.4
55-59       18.1         11.7       24.3         13.6
60-64       26.9         20.3       37.0         19.3
65-69       41.0         30.9       54.6         35.1
70-74       66.0         54.3       71.1         50.0
Run Code Online (Sandbox Code Playgroud)

现在,要在barplot上执行文本,我们基本上绘制了barplot,然后使用R命令在顶部绘制文本text(请参阅参考资料?text)。

text需要x,y坐标和相应的文本片段在条形图上绘制。我们将为其提供条形图中每条线的坐标以绘制文本。

为此,请参见“值”部分?barplot。此函数不仅可以绘制条形图,而且还可以返回每个条形的x坐标。得分!

> bar <- barplot(VADeaths)
> bar
[1] 0.7 1.9 3.1 4.3
Run Code Online (Sandbox Code Playgroud)

现在,我们需要的是y坐标和x坐标。

好吧,一个堆积的条形图会VADeaths随着您的前进准确地记录频率。例如,在“农村男性”组中,第一行绘制在11.7,第二行绘制在11.7 + 18.1 = 29.8,第三行在绘制11.7 + 18.1 + 26.9 = 56.7,依此类推(请参阅中的值VADeaths)。

因此,我们的y坐标需要是沿列向下的累积总和。

要计算每一列的值,我们可以使用cumsum。例如

> cumsum(c(1,2,3,4,5))
[1]  1  3  6 10 15
Run Code Online (Sandbox Code Playgroud)

因为我们想这样做的每一列VADeaths,我们要使用的功能apply

> apply(VADeaths,2,cumsum)
      Rural Male Rural Female Urban Male Urban Female
50-54       11.7          8.7       15.4          8.4
55-59       29.8         20.4       39.7         22.0
60-64       56.7         40.7       76.7         41.3
65-69       97.7         71.6      131.3         76.4
70-74      163.7        125.9      202.4        126.4
Run Code Online (Sandbox Code Playgroud)

apply(VADeaths,2,cumsum)表示:“对于中的每一列VADeaths,计算该cumsum的”。这为条形图的每一条线提供了y值。

让我们保存这些yvalue以便进一步使用:

> yvals <- as.vector(apply(VADeaths,2,cumsum))
Run Code Online (Sandbox Code Playgroud)

我使用的原因as.vector仅仅是将矩阵展平为值的向量-它使绘制更加容易。

最后一件事-我的x值(我存储在中bar)每条只有一个值,但是我需要扩展它,所以每条上每行有一个x值。去做这个:

> xvals <- rep(bar,each=nrow(VADeaths))
Run Code Online (Sandbox Code Playgroud)

这把我以前的x1,x2,x3,x4变成了x1,x1,x1,x1,x1, x2,x2,x2,x2,x2, ..., x4,x4,x4,x4,x4。现在我的xvals比赛我的yvals

之后,这只是使用的一种情况text

> text( xvals, yvals, labels=yvals, pos=3 )
Run Code Online (Sandbox Code Playgroud)

labels参数告诉text什么文本在X / Y位置放。的pos=3意思是“绘制文本的每一位刚刚超过我的指定的X / Y值”。否则,数字将绘制在条形图的线上,这将很难阅读。

现在,有许多选项可用于自定义文本的位置和大小,建议您阅读?text以了解它们。

所有这些代码都精简为我在回答开始时给出的两层代码,但是此版本可能更易于理解:

bar <- barplot(VADeaths)
xvals <- rep(bar,each=nrow(VADeaths))
yvals <- as.vector(apply(VADeaths,2,cumsum))
text( xvals, yvals, labels=yvals, pos=3 )
Run Code Online (Sandbox Code Playgroud)