[英]Conditional vjust for barplot labels in R ggplot2
我有一个Excel文件,其中包含有关不同性别的数据。 我正在用read.csv阅读它。 我正在使用ggplot绘制该数据的条形图。
这是数据:
> dput(dat.absolventen$Geschlecht)
structure(c(1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L,
1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("männlich",
"weiblich"), class = "factor")
这是我的代码:
ggplot(data = d, aes(x=Geschlecht,y=(..count..)/sum(..count..))) +
geom_bar(
fill="steelblue"
) +
geom_text(aes(label = sprintf("%0.1f%%",(..count..)/sum(..count..)*100)),
stat = "count",
colour = "white",
vjust = +2,
fontface = "bold"
)
这给了我足够好的图表。 有9位女性和32位男性。 我可以了解一下每个条形图中的百分比。 但是,我想显示条形图中男性的百分比,以及条形以外或不在顶部的女性的百分比(基本上,如果条形太短,请将标签移到外部)。
我知道我可以使用ifelse(),但我不知道如何将其用于每个值,即男性和女性的总数。 如果在定义aes(label = ...)时使用ifelse(),则将条件应用于整个列。 我希望它测试每个酒吧,即男性和女性,然后根据小于或大于例如15的标准进行调整。
我尝试使用
ifelse(..count.. >15, -2, +2)
但这给了我“ ..count .. not found”的错误。 而且我不确定为什么会这样说,因为在定义美学时,我使用的是..count ..并且在那里起作用。
以前也有很多类似的问题,但是我一直无法从他们那里得到任何帮助,这就是为什么我不得不再次询问这个特殊情况。 问候。
我认为这个问题是您只能在aes()内部访问..count..。 您无法将其传递给调整,因为它尚未定义。 这是一个hacky解决方案。 基本上,我根据分组因子表找出ggplot之外的调整,将其称为adj
,并将该信息提供给ggplot。
vec <- structure(c(1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L,
1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("männlich",
"weiblich"), class = "factor")
d <- data.frame(gender = vec)
nums <- table(d)
adj <- ifelse(nums > 15, 2, -2)
ggplot(data = d, aes(x=gender,y=(..count..)/sum(..count..))) +
geom_bar(
fill="steelblue"
) +
geom_text(aes(label = sprintf("%0.1f%%",(..count..)/sum(..count..)*100)),
stat = "count",
colour = "black",
vjust = adj,
fontface = "bold"
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.