我想用条形图标记条形图中的每个方框(即数据框中的观察数量)。
例如,如果第一个变量有3个级别而第二个变量有4个级别,我想要12个标签。
(另外,是否可以控制这些标签的大小或位置)
感谢您的帮助。
答案 0 :(得分:4)
以下是一种方法,使用数据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)
看起来像这样:
要修改字体大小,您可以使用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
现在,要在条形图上执行文本,我们基本上绘制条形图,然后使用R命令text
在顶部绘制文本(请参阅?text
)。
text
需要在条形图上绘制x,y坐标和相应的文本。我们将在条形图中给出每条线的坐标以绘制文本。
要执行此操作,请参阅“值”部分?barplot
。此功能不仅绘制条形图,还返回每个条形的x坐标。得分!
> bar <- barplot(VADeaths)
> bar
[1] 0.7 1.9 3.1 4.3
现在我们需要的是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
由于我们希望在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
apply(VADeaths,2,cumsum)
表示:“对于VADeaths
中的每一列,请计算其中的cumsum
”。
这给出了条形图每条线的y值。
让我们保存这些yvalues以供进一步使用:
> yvals <- as.vector(apply(VADeaths,2,cumsum))
我使用as.vector
的原因只是将矩阵展平为值向量 - 它使绘图更容易。
最后一件事 - 我的x值(我存储在bar
中)每个条只有一个值,但我需要将其展开,以便每个条上每行有一个x值。要做到这一点:
> xvals <- rep(bar,each=nrow(VADeaths))
这会将我之前的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 )
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 )