geom_text 如何根据需要在栏上放置文本?

Posted

技术标签:

【中文标题】geom_text 如何根据需要在栏上放置文本?【英文标题】:geom_text how to position the text on bar as I want? 【发布时间】:2017-03-05 19:40:08 【问题描述】:

我想调整条形图上的文字。

我尝试调整 hjust/vjust 以按我喜欢的方式显示,但它似乎无法正常工作。

ggplot(data) + 
        geom_bar(aes(name, count, 
        fill = week), stat='identity', position = 'dodge') +
        geom_text(aes(name,count, 
        label=count),hjust=0.5, vjust=3, size=2,
        position = position_dodge(width = 1)) + 
        coord_flip()

所以我希望数字位于每个条的中间、右边缘,这样它就可以阅读,而不会像最后部分那样重叠。

【问题讨论】:

你需要包含足够的数据to make your example reproducible。 【参考方案1】:

position_dodge() 语句采用宽度参数。为确保文本在条的末尾居中(即条的闪避宽度与文本相同),在geom_bar 和@987654324 内为position_dodge() 语句提供相同的宽度参数@。

geom_bar还有一个宽度参数,即条的宽度。如果您希望条形在每个name 内相互对接,请将条形宽度设置为与闪避宽度相同;如果您想要条之间的小间隙,请使条宽度略小于闪避宽度。

如果您使用全局美学,则不需要group 美学(但是,仅使用局部美学,您将需要geom_text 的群体美学)。

hjust = -0.5 将文本标签定位在条的末端之外; hjust = 1.5 将它们放置在条的末端内。

library(ggplot2)

# Generate some data - using @tchakravarty's data - Thanks.
df = data.frame(
  week = as.factor(rep(c(1, 2), times = 5)),
  name = as.factor(rep(LETTERS[1:5], times = 2)),
  count = rpois(n = 10, lambda = 20))

position = position_dodge(width = .75)
width = .75

ggplot(df, aes(x = name, y = count, label = count, fill = week)) + 
  geom_bar(width = width, stat='identity', position = position) +
  geom_text(hjust = -0.5, size = 2, position = position) +
  coord_flip() + 
  theme_bw()



# To separate the bars slightly:
position = position_dodge(width = .75)
width = .65

ggplot(df, aes(x = name, y = count, label = count, fill = week)) + 
  geom_bar(width = width, stat='identity', position = position) +
  geom_text(hjust = -0.5, size = 2, position = position) +
  coord_flip() + 
  theme_bw()

【讨论】:

这是非常有效且更快地绘制图表的方式!谢谢@sandy-muspratt【参考方案2】:

编辑:

hjust/vjust 表现智能的更简单的解决方案是将group 美学添加到geom_text,然后hjustposition 自动调整为group

1。垂直方向

ggplot(data) + 
  geom_bar(
    aes(x = name, y = count, fill = week, group = week), 
    stat='identity', position = 'dodge'
  ) +
  geom_text(
    aes(x = name, y = count, label = count, group = week),
    position = position_dodge(width = 1),
    vjust = -0.5, size = 2
  ) + 
  theme_bw()

这给出:

2。水平方向

ggplot(data) + 
  geom_bar(
    aes(x = name, y = count, fill = week, group = week), 
    stat='identity', position = 'dodge'
  ) +
  geom_text(
    aes(x = name, y = count, label = count, group = week), 
    hjust = -0.5, size = 2,
    position = position_dodge(width = 1),
    inherit.aes = TRUE
  ) + 
  coord_flip() + 
  theme_bw()

这给出:


这不一定是最通用的方法,但您可以有一个 fill 依赖 hjust(或 vjust,取决于方向)变量。我并不完全清楚如何选择调整参数的值,目前它是基于 看起来 正确的。也许其他人可以建议一种更通用的方法来选择这个参数值。

1。垂直方向

library(dplyr)
library(ggplot2)

# generate some data
data = data_frame(
  week = as.factor(rep(c(1, 2), times = 5)),
  name = as.factor(rep(LETTERS[1:5], times = 2)),
  count = rpois(n = 10, lambda = 20),
  hjust = if_else(week == 1, 5, -5),
  vjust = if_else(week == 1, 3.5, -3.5)
)

# Horizontal
ggplot(data) + 
  geom_bar(
    aes(x = name, y = count, fill = week, group = week), 
    stat='identity', position = 'dodge'
  ) +
  geom_text(
    aes(x = name, y = count, label = count, vjust = vjust), 
    hjust = -0.5, size = 2,
    inherit.aes = TRUE
  ) + 
  coord_flip() + 
  theme_bw() 

看起来是这样的:

2。水平方向

ggplot(data) + 
  geom_bar(
    aes(x = name, y = count, fill = week, group = week), 
    stat='identity', position = 'dodge'
  ) +
  geom_text(
    aes(x = name, y = count, label = count, vjust = vjust), 
    hjust = -0.5, size = 2,
    inherit.aes = TRUE
  ) + 
  coord_flip() + 
  theme_bw()

看起来是这样的:

【讨论】:

这绝对是我最终想要创建的前景,但是当我将它应用到我的工作时,它返回错误 eval(expr, envir, enclos) : object 'vjust' not found。 vjust=vjust 是如何工作的?这背后的逻辑是什么? @silverrain 您是否使用我提供的代码更新了数据集?您需要在数据集中创建一个名为 vjust/hjust 的新变量,其中包含 fill 变量相关调整值。说了这么多,这是此版本解决方案所必需的,但我将更新解决方案,以便更容易做到这一点。 非常感谢!我在你的 cmets 之后检查了 vjust/hjust,并且想知道如何自动化它!我认为分组选项非常聪明和高效!非常感谢您的帮助!

以上是关于geom_text 如何根据需要在栏上放置文本?的主要内容,如果未能解决你的问题,请参考以下文章

ggplot:如何根据变量类型在 geom_text 位置上设置不同的对齐方式?

当视图在栏上时为 UITabBar 设置单独的标题与更多...?

如何使用ggplot2用正负条标记条形图

如何在 ggplot 的 geom_text_repel 或 geom_text 标签中包含斜体文本?

处理 geom_text 大小

s-s-rS:如何将图表绑定到垂直标题栏 (tablix)?