我正在尝试使用 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)
正如您在下面看到的,标签被截断了。
图表 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 的外侧。
有没有一种编程方式可以让我从图表 1 和图表 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
),
)
此图中的结果:
关于r - geom_bar 上的定位标签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26853926/