在geom_bar上定位标签

时间:2014-11-10 22:09:18

标签: 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))

图表1

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)

如下所示,标签会被截断。 Chart 1

图表2

然后我遇到了这个question,这很有帮助,让我意识到我正在根据我的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所示。 chart 2

有没有一种编程方式,我可以从图表1和图表2中获得两个方面的最佳效果?

3 个答案:

答案 0 :(得分: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) 

enter image description here

答案 1 :(得分: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。它仍然不适合专门包含文本,但它可以使用固定标签。

答案 2 :(得分:0)

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

此图的结果:

Plot generated by above code