首页 > 解决方案 > 当计数不是数据集中的列时,在 ggplot 中使用 expand_limits (R)

问题描述

我有一个数据集,我需要绘制一个条形图来记录某一列的不同结果的计数。对于这个例子,我使用的是 mtcars 数据集。

当我第一次尝试这个时,我发现条上的标签在顶部被切断了,所以我使用 expand_limits 参数给它们更多的空间。由于我希望能够将此代码用于刷新数据,因此限制可能会发生变化,这就是我使用 max() 函数的原因。

mtcars_cyl_counts <- as.data.frame(table(mtcars$cyl))
colnames(mtcars_cyl_counts)[1:2] <- c("cyl", "counts")

mtcars_cyl_counts %>% 
  arrange(desc(counts)) %>%
  ggplot(aes(x = reorder(cyl, -counts), y = counts)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = comma(counts), vjust = -0.5), size = 3) +
  expand_limits(y = max((mtcars_cyl_counts$counts) * 1.05))

这工作正常,但创建一个单独的计数表似乎不必要的麻烦,并且使一些未来的代码更加复杂,所以我重新做了这个:

mtcars %>%
  group_by(cyl) %>%
  summarize(counts = n()) %>%
  arrange(-counts) %>%
  mutate(cyl = factor(cyl, cyl)) %>%
  ggplot() +
  geom_bar(aes(x = cyl, y = counts), stat = "identity") +
  geom_text(aes(x = cyl, y = counts, label = comma(counts), vjust = -0.5), size = 3) +
  expand_limits(y = max((counts) * 1.05))

但是,这会返回以下错误:

data.frame 中的错误(...,stringsAsFactors = FALSE):找不到对象“计数”

我知道“计数”在技术上不在 mtcars 数据集中(这就是为什么如果我使用 mtcars$counts 它也不起作用),但这是我在代码中其他地方用于 y 定义的原因。

那么,有没有办法编写它以使其工作,或者以适应不同数据集的方式扩展垂直限制的替代方法?

(注意:在这些示例中,条形标签不会被截断,因为它们不是很大,但为此我只需要扩展限制,以便细节对工作来说不是至关重要的......)

标签: rggplot2geom-bar

解决方案


如果这对梅根有帮助,

mtcars %>%
    count(cyl) %>% 
    arrange(-n) %>% 
    mutate(cyl = factor(cyl, cyl)) %>% 
    ggplot(aes(cyl, n)) +
    geom_text(vjust = -0.5, aes(label = n)) +
    geom_bar(stat = "identity") +
    expand_limits(y = max(table(mtcars$cyl) * 1.05))

推荐阅读