我想按其大小(即该组中数据框中的观察值的数量)在条形图中标记每个框。
例如,如果第一个变量具有3个级别,第二个变量具有4个级别,那么我想要12个标签。
(也可以控制这些标签的大小或位置)
感谢您的任何帮助。
这是一种实现方法,以数据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)