繁体   English   中英

在geom_bar上定位标签

[英]positioning labels on geom_bar

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

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

图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中获得两个方面的最佳效果?

这是一种方式。 这是一个有点冗长的方法,但您可以为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) 

在此输入图像描述

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

结果在这个情节中:

由上面的代码生成的图

我会误读程序性的“务实”。 添加“+ 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。 它仍然不适合专门包含文本,但它适用于固定标签。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM