【问题标题】:Position geom_text on dodged barplot在闪避的条形图上定位 geom_text
【发布时间】:2011-08-26 10:10:54
【问题描述】:

我试图让标题不言自明,但这里是 - 数据优先:

dtf <- structure(list(variable = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 
4L, 4L, 5L, 5L), .Label = c("vma", "vla", "ia", "fma", "fla"), class = "factor"), 
    ustanova = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L), .Label = c("srednja škola", "fakultet"), class = "factor"), 
    `(all)` = c(42.9542857142857, 38.7803203661327, 37.8996138996139, 
    33.7672811059908, 29.591439688716, 26.1890660592255, 27.9557692307692, 
    23.9426605504587, 33.2200772200772, 26.9493087557604)), .Names = c("variable", 
"ustanova", "(all)"), row.names = c(NA, 10L), class = c("cast_df", 
"data.frame"), idvars = c("variable", "ustanova"), rdimnames = list(
    structure(list(variable = structure(c(1L, 1L, 2L, 2L, 3L, 
    3L, 4L, 4L, 5L, 5L), .Label = c("vma", "vla", "ia", "fma", 
    "fla"), class = "factor"), ustanova = structure(c(1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("srednja škola", 
    "fakultet"), class = "factor")), .Names = c("variable", "ustanova"
    ), row.names = c("vma_srednja škola", "vma_fakultet", "vla_srednja škola", 
    "vla_fakultet", "ia_srednja škola", "ia_fakultet", "fma_srednja škola", 
    "fma_fakultet", "fla_srednja škola", "fla_fakultet"), class = "data.frame"), 
    structure(list(value = structure(1L, .Label = "(all)", class = "factor")), .Names = "value", row.names = "(all)", class = "data.frame")))

我想创建一个闪避的条形图,执行coord_flip 并在条内放置一些文本标签:

ggplot(bar) + geom_bar(aes(variable, `(all)`, fill = ustanova), position = "dodge") +
 geom_text(aes(variable, `(all)`, label = sprintf("%2.1f", `(all)`)), position = "dodge") +
 coord_flip()

你可以看到输出here

我想我要求的是一些微不足道的事情。我希望文本标签“跟随”堆叠条。标签在 y 轴上正确放置,但是如何在 x 轴上正确放置?

【问题讨论】:

  • 是的...我应该在 ggplot2 邮件列表上发布这个。我不想交叉发布,所以我要戴上耐心的帽子,等待@hadley 提出一些建议! =)
  • 我错了。而且我显然需要更熟悉 ggplot 包。

标签: r plot ggplot2 bar-chart


【解决方案1】:

这是你想要的吗?

library(ggplot2)

ggplot(bar) + 
  geom_col(aes(variable, `(all)`, fill = ustanova), position = "dodge") +
  geom_text(aes(variable, `(all)`, label = sprintf("%2.1f", `(all)`), group = ustanova), 
            position = position_dodge(width = .9)) +
  coord_flip()

关键是position = position_dodge(width = .9)(其中.9是条的默认宽度)而不是position = "dodge",这只是一个没有任何参数的快捷方式。此外,您必须在geom_text 中设置group=ustanova 美学以通过ustanova 避开标签(第二种选择是通过fill = ustanova 使fill = ustanova 成为全球美学ggplot(bar, aes(fill = ustanova))


ggplot2_2.0.0 中,您可以在?geom_text 中找到几个关于如何将geom_text 定位在闪避或堆叠柱上的示例(名为“# Aligning labels and bars"”的代码块)。问答What is the width argument in position_dodge? 提供了更全面的描述主题。

【讨论】:

  • 那么有没有办法自动化呢?必须始终指定宽度?
  • 这仅在我在geom_text 层中添加fill = ustanova 后才对我有用,这很有意义,尤其是当您有许多水平条(每个 x 可能只需要 3 个以上的条)和数量文本的分隔符必须与条的分隔符相同。
  • 对于刻面和回避,这是一个有用的答案:stackoverflow.com/a/26661791/1000343
猜你喜欢
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
相关资源
最近更新 更多