gpt4 book ai didi

r - ggplot2:当低条使文本超过条的底部时,如何有条件地更改 geom_text 的 vjust

转载 作者:行者123 更新时间:2023-12-04 02:28:10 26 4
gpt4 key购买 nike

绘制条形图时,我经常为条形添加标签以表示每个条形的 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 package (v0.3.0) 于 2021-01-25 创建

查看 AB- 的栏,我们可以看到 0.01 文本超出了栏的高度(在栏的底部)。在这种情况下,我想将 vjustgeom_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 package (v0.3.0) 于 2021-01-25 创建

在这里,我们看到 c 栏的 500 文本超出了栏的底部。因此,在这种情况下,我还想将 geom_text()vjust 更改为 0 ,仅用于 bar c

总结
尽管有一些解决方案可以使用基于 y 值的简单 vjust(请参阅 this SO solution )有条件地更改 ifelse,但我试图弄清楚如何调节 vjust 使其无论 y 刻度上的值如何都可以工作。相反,规则应该是,如果条的高度低于 geom_text() 的大小,则文本位置将移动到顶部。谢谢!

编辑

基于下面与@Paul 的讨论,我想知道是否可以更容易地根据 vjust 位置是否覆盖 geom_text() 来调整 y = 0 ,如果是,将 vjust 更改为 0

编辑 2

This SO solution(归功于 @Paul 的发现)似乎与我要问的非常接近。它会动态更改 sizegeom_text() 以适应条形宽度,并且即使在调整绘图大小时也能正常工作。所以我认为这为我所追求的提供了基础,我需要调整 size 而不是调整 vjust ,而不是根据条宽调整它,我需要根据条高调整它。不幸的是,我对 ggproto 等的理解太复杂了,所以我不知道如何根据我的情况调整它。

最佳答案

作为实现所需结果的开箱即用选项,我建议查看 ggfittext 包,其中有一些选项可以将标签放在条形之外,如果它们不适合内部或缩小标签.此外,还有一些选项可以在标签周围添加一些填充。但是,它使用无默认大小策略,因此您必须将默认单位乘以 ggplot2::.pt :

library(ggplot2)
library(ggfittext)

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_bar_text(aes(label = quantity),
color = "red",
vjust = 1,
size = 7 * ggplot2::.pt,
min.size = 7 * ggplot2::.pt,
padding.x = grid::unit(0, "pt"),
padding.y = grid::unit(0, "pt"),
outside = TRUE)
#> Warning: Ignoring unknown aesthetics: label

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_bar_text(aes(label = frequency),
color = "blue",
vjust = 1,
size = 7 * ggplot2::.pt,
min.size = 7 * ggplot2::.pt,
padding.x = grid::unit(0, "pt"),
padding.y = grid::unit(0, "pt"),
outside = TRUE)
#> Warning: Ignoring unknown aesthetics: label

关于r - ggplot2:当低条使文本超过条的底部时,如何有条件地更改 geom_text 的 vjust,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65883795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com