4

我正在尝试使用 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))

图一

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)

正如您在下面看到的,标签被截断。 图一

图 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)

但是您可以在下面看到只有 2 个标签适合条形图,所以我希望其他标签放在最后,在条形图的外侧,如图 1 所示。 图 2

有没有一种编程方式可以让我从图表 1 和图表 2 中获得两全其美?

4

3 回答 3

3

这是一种方法。这是一个有点冗长的方法,但您可以将数据子集化为geom_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) 

在此处输入图像描述

于 2014-11-10T23:56:52.707 回答
2

hjust移入aes以便我们可以改变该值,然后如果条形超过最大值,则移动它。它仍然有点hacky,因为它对缩放做出假设,但看起来相当不错。除数可能需要调整:

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
    ),
  )

此图中的结果:

以上代码生成的绘图

于 2019-06-01T02:46:03.883 回答
0

我会把程序化误读为“务实”。添加“+ 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。它仍然不适合具体包含文本的情节,但它可以使用固定标签。

于 2014-11-10T23:38:29.050 回答