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

R ggplot2条形图:仅取决于条形图和标签大小,r,ggplot2,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

作为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值可能在10000到100000之间;…),这会导致最短条的标签与我正在使用的
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)))

<代码> Max

在杆外有一些标签,一些内部可以扭曲大小的可视编码作为条的长度。另一种选择是将值放在条的中间,但是设置<代码> GeOMGEXTION/COD>跳过相对于最大条小的值。或者,如果您想为所有的条形值添加文本,您可以将它们放在横杆下方,以保持横杆长度的清晰视觉模式。这两个选项的示例如下:

# 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)
#伪造数据
dat=数据帧(x=字母[1:5],y=c(432134910819548912123))
ggplot(dat,aes(x,y,fill=x))+
几何图形栏(stat=“identity”)+
几何图形文本(aes(标签=ifelse(y<0.05*max(dat$y)),格式(y,big.mark=“,”),y=0.5*y),
color=“白色”)+
坐标翻转(xlim=c(0.4,5.6),ylim=c(0,1.03*max(dat$y)),展开=FALSE)+
辅助线(填充=假)
ggplot(dat,aes(x,y,fill=x))+
geom_hline(yintercept=0,lwd=0.3,color=“grey40”)+
几何图形栏(stat=“identity”)+
geom_文本(aes(标签=格式(y,big.mark=“,”),y=-0.01*max(dat$y)),
尺寸=3.5,hjust=1)+
坐标翻转(ylim=c(-0.04*max(dat$y),max(dat$y)))+
辅助线(填充=假)

不,不是。谢谢!您的策略似乎是最干净的自动方式。