每个样品的R barplot标签大小

时间:2012-01-19 05:12:15

标签: r plot

我想用条形图标记条形图中的每个方框(即数据框中的观察数量)。

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

(另外,是否可以控制这些标签的大小或位置)

感谢您的帮助。

1 个答案:

答案 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)

看起来像这样:

enter image description here

要修改字体大小,您可以使用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 )