r - ggplot2 条形图 : hjust depending on bar and label size

标签 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 之间;dataset_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)))

最佳答案

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

关于r - ggplot2 条形图 : hjust depending on bar and label size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40445986/

相关文章:

r - 对所有参数组合应用函数(输出为列表)

r - 如何使用 Nextflow 从 R 可执行文件调用不同 R 脚本中存在的函数

r - 这些是字符串还是变量?

r - 日历热图俄罗斯方 block 图表

r - 在 grid.arrange 中保留或设置文本标签与绘图大小之间的比例

r - 计算所有行之间差异的最有效方法

r - 对数据框的每一行进行排序

r - 在构面 (R) 中的所有背景数据上绘制突出显示的线(分类)

r - 如何在ggplot中将轴值强制为科学计数法

r - R 中的 while 与重复循环?