21

我正在尝试在 barplot 中显示频率……好吧,我希望它们在图表中的某个位置:在条形图下方、条形图内、条形图上方或图例区域中。我记得(我可能错了)它可以在ggplot2. 这可能很容易……至少看起来很容易。这是代码:

p <- ggplot(mtcars)
p + aes(factor(cyl)) + geom_bar()

有没有机会在图表中嵌入频率?

4

5 回答 5

24

geom_texttext来自基本图形的模拟:

p + geom_bar() + stat_bin(aes(label=..count..), vjust=0, 
                          geom="text", position="identity")

如果要调整标签的 y 位置,可以使用y=美学 inside stat_bin:例如,y=..count..+1将标签放在条形上方一个单位。

geom_text如果您使用and stat="bin"inside ,上述方法也有效。

于 2010-03-31T13:35:37.290 回答
4

很难做到这一点。我确信有更好的方法。

ggplot(mtcars,aes(factor(cyl))) + 
geom_bar() + 
geom_text(aes(y=sapply(cyl,function(x) 1+table(cyl)[names(table(cyl))==x]),
label=sapply(cyl,function(x) table(cyl)[names(table(cyl))==x])))
于 2010-03-31T12:56:04.930 回答
1

当想要添加不同的信息时,以下工作:

ggplot(mydata, aes(x=clusterSize, y=occurence)) +
geom_bar() + geom_text(aes(x=clusterSize, y=occurence, label = mydata$otherinfo))
于 2010-06-07T21:51:16.713 回答
1

或者,我发现使用一些可用的注释函数很有用:ggplot2::annotateggplot2::annotation_customcowplot::draw_label它是 的包装annotation_custom)。

ggplot2::annotate只是回收 geom 文本选项。对于在画布上的任何位置进行绘图更有利的是ggplot2::annotation_custom或提供的可能性cowplot::draw_label

例子ggplot2::annotate

library(ggplot2)

p <- ggplot(mtcars) + aes(factor(cyl)) + geom_bar()

# Get data from the graph
p_dt <- layer_data(p) # or ggplot_build(p)$data

p + annotate(geom = "text", label = p_dt$count, x = p_dt$x, y = 15)

或允许y变化:

p + annotate(geom = "text", label = p_dt$count, x = p_dt$x, y = p_dt$y + 1)

示例ggplot2::annotation_custom

尝试在更“非常规”的ggplot2::annotate地方绘图时有局限性,因为它最初被问到(“图表中的某处”)。但是,ggplot2::annotation_custom结合设置 clipping off ,允许在画布/工作表上的任何位置进行注释,如下例所示:

p2 <- p + coord_cartesian(clip = "off")
for (i in 1:nrow(p_dt)){
  p2 <- p2 + annotation_custom(grid::textGrob(p_dt$count[i]), 
                               xmin = p_dt$x[i], xmax = p_dt$x[i], ymin = -1, ymax = -1)
}
p2

示例cowplot::draw_label

cowplot::draw_label是 , 的包装ggplot2::annotation_custom,并且稍微不那么冗长(因此)。它还需要剪裁才能在画布上的任何位置绘制。

library(cowplot)
#> Warning: package 'cowplot' was built under R version 3.5.2
#> 
#> Attaching package: 'cowplot'
#> The following object is masked from 'package:ggplot2':
#> 
#>     ggsave
# Revert to default theme; see https://stackoverflow.com/a/41096936/5193830
theme_set(theme_grey())

p3 <- p + coord_cartesian(clip = "off")
for (i in 1:nrow(p_dt)){
  p3 <- p3 + draw_label(label = p_dt$count[i], x = p_dt$x[i], y = -1.8)
}
p3

注意,draw_label也可以和 结合使用cowplot::ggdraw,切换到相对坐标,范围从 0 到 1(相对于整个画布,参见示例help(draw_label))。在这种情况下coord_cartesian(clip = "off"),不再需要设置,因为事情由ggdraw.

reprex 包(v0.2.1)于 2019 年 1 月 16 日创建

于 2019-01-16T22:58:32.403 回答
-1

如果您不限于 ggplot2,您可以使用基本图形中的 ?text 或 plotrix 包中的 ?boxed.labels。

于 2010-03-31T12:15:13.927 回答