我正在尝试使用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中获得两个方面的最佳效果?
答案 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)
答案 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
),
)
此图的结果: