在绘制条形图时,我经常给条形添加标签以表示每个条形的 y 值。但是,当栏变得太低时,我会遇到麻烦,使标签不可读或简直丑陋。
例子
library(ggplot2)
df_blood <- data.frame(blood_type = c("O-", "O+", "A-", "A+", "B-", "B+", "AB-", "AB+"),
frequency = c(0.13, 0.35, 0.08, 0.3, 0.02, 0.08, 0.01, 0.02))
ggplot(df_blood, aes(x = blood_type, y = frequency, fill = blood_type)) +
geom_bar(stat = "identity") +
geom_text(aes(label = frequency), color = "blue", vjust = 1, size = 7)
由reprex 包(v0.3.0)
创建于 2021-01-25 查看
栏,AB-
我们可以看到0.01
文本超出栏的高度(在栏的底部)。在这种情况下,我想将 的更改vjust
为。geom_text()
0
另一个具有不同 y 比例的示例
在这里,我使用与size = 7
上面相同的方法geom_text()
:
library(ggplot2)
df_something <- data.frame(something = c("a", "b", "c"),
quantity = c(10000, 7800, 500))
ggplot(df_something, aes(x = something, y = quantity)) +
geom_bar(stat = "identity", fill = "black") +
geom_text(aes(label = quantity), color = "red", vjust = 1, size = 7)
由reprex 包(v0.3.0)
于 2021 年 1 月 25 日创建在
这里,我们看到 for 栏c
的500
文本超出了栏的底部。所以在这种情况下,我也想将geom_text()
's更改vjust
为0
, 仅用于 bar c
。
总结一下
尽管有一些解决方案可以根据 y 值vjust
通过简单的ifelse
(请参阅此 SO 解决方案)进行有条件地更改,但我试图弄清楚如何进行调节vjust
,以使其无论 y 刻度上的值如何都可以工作。相反,规则应该是,如果栏的高度低于 size of geom_text()
,则文本位置将移动到顶部。谢谢!
编辑
根据下面与@Paul 的讨论,我想知道是否可以更容易地vjust
确定geom_text()
position 是否覆盖y = 0
,如果是,则更vjust
改为0
.
编辑 2
这个 SO 解决方案(归功于@Paul的发现)似乎与我的要求足够接近。它会动态更改size
ofgeom_text()
以适合条形宽度,并且即使在调整绘图大小时也能正常工作。所以我认为这为我所追求的提供了基础,而不是调整size
我需要调整vjust
,而不是调整它的条宽,我需要调整它的条高。不幸的是,它对于我的理解和类似的东西来说太复杂了ggproto
,所以我不知道如何适应我的情况。