作为 R 的新手,我使用 ggplot2 和 coord_flip()
制作了非常简单的水平条形图。 .
值得注意的是,默认情况下,我使用以下命令在栏的左侧(如果标签不适合则在右侧)插入 x 变量的值:
geom_text(aes(x=TYPE, y=COUNT, ymax=COUNT, label=COUNT,
hjust=ifelse(COUNT>1000, 1.5, -0.3)),
size=3.5, position = position_dodge(width=0.8))
问题是,根据数据集,x 值可能会有很大差异(例如 dataset_1 x 值可以在 1 到 200 之间;dataset_2 x 值可以在 10,000 到 100,000 之间;...),这导致标签与
ifelse
错位的最短条我正在使用的语句(见下图 A 中的棕色条)。在这种情况下,我不能只使用常量
COUNT>1000
所有数据集的条件。图A:
我可以手动修改
hjust=ifelse(COUNT>1000,...
的值每个数据集的声明。但我想知道是否可以在不修改
ifelse
的值的情况下,将标签不适合轴和条形顶部之间的标签自动移出条形。每个数据集的条件,如下图 B 所示。图B:
编辑
解决方法(不完美但更好):
如果值小于最大值的 5%,则将标签放在栏的右侧
MAXI <- max(data[,2])
geom_text(aes(x=TYPE, y=COUNT, ymax=COUNT, label=COUNT,
hjust=ifelse((COUNT/MAXI)<0.05, -0.3, 1.3)))
最佳答案
在条形外部有一些标签而在内部有一些标签可能会扭曲作为条形长度的幅度的视觉编码。另一种选择是将值放在条形的中间,但设置 geom_text
跳过相对于最大柱线较小的值。或者,如果您想为添加的所有条形值包含文本,您可以将它们放在条形下方,以保持条形长度的清晰视觉模式。两个选项的示例如下:
# Fake data
dat = data.frame(x = LETTERS[1:5], y=c(432, 1349, 10819, 5489, 12123))
ggplot(dat, aes(x, y, fill=x)) +
geom_bar(stat="identity") +
geom_text(aes(label=ifelse(y < 0.05*max(dat$y), "", format(y, big.mark=",")), y=0.5*y),
colour="white") +
coord_flip(xlim=c(0.4,5.6), ylim=c(0, 1.03*max(dat$y)), expand=FALSE) +
guides(fill=FALSE)
ggplot(dat, aes(x, y, fill=x)) +
geom_hline(yintercept=0, lwd=0.3, colour="grey40") +
geom_bar(stat="identity") +
geom_text(aes(label=format(y, big.mark=","), y=-0.01*max(dat$y)),
size=3.5, hjust=1) +
coord_flip(ylim = c(-0.04*max(dat$y), max(dat$y))) +
guides(fill=FALSE)
关于r - ggplot2 条形图 : hjust depending on bar and label size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40445986/