ggplot2条形图:hjust取决于条形和标签大小

时间:2016-11-06 04:28:06

标签: r ggplot2

作为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之间;数据集_2 x值可能在10,000到100,000之间; ......),这会导致最短条的标签与我正在使用的ifelse语句错位(见下图A中的棕色条)。 在这种情况下,我不能只对所有数据集使用常量COUNT>1000条件。

图A:

enter image description here

我可以手动修改每个数据集的hjust=ifelse(COUNT>1000,...语句的值。 但是我想知道如果它不适合轴和顶部之间是否可以自动移动条的标签输出而不修改每个数据集的ifelse条件的值,如图B在下面。

图B:

enter image description here

编辑

解决方法(不完美但更好): 如果值小于最大值的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)))

1 个答案:

答案 0 :(得分:1)

在条形图外面有一些标签,而在内部有一些标签可能会扭曲视觉编码的大小作为条形的长度。另一种选择是将值放在条形图的中间,但设置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)

enter image description here