R 在geom_栏上定位标签

R 在geom_栏上定位标签,r,ggplot2,geom-bar,geom-text,R,Ggplot2,Geom Bar,Geom Text,我正在尝试使用ggplot创建带有类别标签的水平条形图 我已经能够轻松地创建绘图,并且可以贴上标签,但是我遇到了格式问题。最终,如果合适的话,我希望我的标签在吧台内,否则就在吧台外而不截断标签 以下是我到目前为止所做的尝试 数据 dt1 <- data.table(x=c("a","b","c","d","e"), y=c(43,52,296,102,157), y2=c(50,10,100,45,80)) 如下图所示,标签被截断。 图2 然后我遇到了这一点,这很有帮助,使我意识到我是

我正在尝试使用ggplot创建带有类别标签的水平条形图

我已经能够轻松地创建绘图,并且可以贴上标签,但是我遇到了格式问题。最终,如果合适的话,我希望我的标签在吧台内,否则就在吧台外而不截断标签

以下是我到目前为止所做的尝试

数据

dt1 <- data.table(x=c("a","b","c","d","e"), y=c(43,52,296,102,157), y2=c(50,10,100,45,80))
如下图所示,标签被截断。

图2

然后我遇到了这一点,这很有帮助,使我意识到我是根据y变量设置标签位置的,所以我现在硬编码了它,并使用hjust从轴上填充它

ggplot() + geom_bar(data=dt1, aes(x=x, y=y), stat="identity",fill="red") + coord_flip() +
  geom_text(data=dt1, aes(x=x, y=0, label=paste0("$",y," from ",y2," records")),hjust=-0.1)
但是你可以在下面看到,只有两个标签可以放在条内,所以我更喜欢其他标签放在最后,在条外,如图1所示。


有没有一种编程方法可以让我从图1和图2中同时获得最佳效果?

我会把编程误读为“实用”。添加“+scale_y_continuous(limits=c(0,max(dt1$y)+100))”为标签创造了足够的空间。我缺乏上传情节的声誉

ggplot() + geom_bar(data=dt1, aes(x=x, y=y), stat="identity",fill="red") + coord_flip() + geom_text(data=dt1, aes(x=x, y=y, label=paste0("$",y," from ",y2," records")),hjust=0) + scale_y_continuous(limits=c(0,max(dt1$y)+100))

编辑2;我修改了代码以检索最大值并向其添加100。它仍然不适合在绘图中特别包含文本,但它可以使用固定标签。

这里是一种方法。这是一种有点冗长的方法,但您可以为
geom\u text
对数据进行子集。通过这种方式,可以手动为每个条指定所需的位置

ggplot() + 
geom_bar(data = dt1, aes(x=x, y=y), stat="identity",fill="red") +
coord_flip() +
geom_text(data = filter(dt1, x == "e" | x == "c"),
     aes(x=x, y=0, label=paste0("$",y," from ",y2," records")),hjust = -0.1) +
geom_text(data = filter(dt1, x == "d"),
     aes(x=x, y=0, label=paste0("$",y," from ",y2," records")),hjust = - 1.1) +
geom_text(data = filter(dt1, x == "b"),
     aes(x=x, y=0, label=paste0("$",y," from ",y2," records")),hjust = - 0.6) +
geom_text(data = filter(dt1, x == "a"),
     aes(x=x, y=0, label=paste0("$",y," from ",y2," records")),hjust = - 0.5) 

hjust
移动到
aes
中,这样我们可以改变该值,然后如果该条超过最大值,则将其移动。它仍然有点粗糙,因为它对缩放进行了假设,但看起来相当不错。除数可能需要调整:

library(tidyverse)

dt1 <- data.frame(x=c("a","b","c","d","e"), y=c(43,52,296,102,157), y2=c(50,10,100,45,80))

ggplot() +
  geom_bar(data=dt1, aes(x=x, y=y), stat="identity",fill="red") +
  coord_flip() +
  geom_text(
    data=dt1,
    aes(
      x=x, y=y,
      label=paste0("$",y," from ",y2," records"),
      hjust=ifelse(y < max(dt1$y) / 1.5, -0.1, 1.1), # <- Here lies the magic
    ),
  )
库(tidyverse)

dt1它提供了帮助,但是它没有解决与两全其美相关的主要问题。我也在寻找一种编程方式来做事情,因为我并不总是知道y的最大值是多少,我更希望不要硬编码限制。手动调整会很痛苦,标签的相对位置会显示出来。@KFB是的,我知道你的意思。如果图形是这样的,我不介意做手工工作。但是如果一个人有大量的团队,他/她必须考虑其他事情。我想这可能有点困难。到目前为止,我认为我的问题中的图表2将是避免人工干预绘图的最佳方法。@Dan我认为您可以选择使标签位置与较少的线保持一致,或与较多的线保持一致。我喜欢你的图表2。如果我是你,我会坚持下去。这是迄今为止我遇到的最好的方法。完全得到除数的调整,但这是整个图表中的一个数字。
library(tidyverse)

dt1 <- data.frame(x=c("a","b","c","d","e"), y=c(43,52,296,102,157), y2=c(50,10,100,45,80))

ggplot() +
  geom_bar(data=dt1, aes(x=x, y=y), stat="identity",fill="red") +
  coord_flip() +
  geom_text(
    data=dt1,
    aes(
      x=x, y=y,
      label=paste0("$",y," from ",y2," records"),
      hjust=ifelse(y < max(dt1$y) / 1.5, -0.1, 1.1), # <- Here lies the magic
    ),
  )