在ggplot2中显示频率和条形图

时间:2010-03-31 10:01:00

标签: r ggplot2 frequency

我正在尝试在条形图中显示频率...好吧,我希望它们在图表中某处:在条形图,条形图,条形图上方或图例区域中。我记得(我可能错了)它可以在ggplot2中完成。这可能很简单......至少看起来很容易。这是代码:

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

我是否有机会在图表中嵌入频率?

5 个答案:

答案 0 :(得分:19)

geom_text与基本图形中的text类似:

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

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

如果你在里面使用geom_textstat="bin",上述内容也适用。

答案 1 :(得分: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])))

答案 2 :(得分:1)

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

ggplot(mydata, aes(x=clusterSize, y=occurence)) +
geom_bar() + geom_text(aes(x=clusterSize, y=occurence, label = mydata$otherinfo))

答案 3 :(得分:0)

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

ggplot2::annotate只是回收geom文本选项。 ggplot2::annotation_customcowplot::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_customsetting 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_labelggplot2::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 package(v0.2.1)于2019-01-16创建

答案 4 :(得分:-1)

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