r - 用正负值标记堆积条形图
问题描述
我正在使用 ggplot2 创建一个带有负值的堆积条形图,并尝试在每个条形图的顶部添加部分的总和作为标签。该代码适用于没有负值的条形图,但存在负值时的标签保留在条形图内。
例子:
test = c("Test1", "Test1", "Test1", "Test2", "Test2", "Test2", "Test3", "Test3", "Test3")
student = c("A", "B", "C", "A", "B", "C", "A", "B", "C")
value = c(5,5,5,3,3,3,-2,6,7)
dummy = data.frame(test, student, value)
g = ggplot(data=dummy, aes(x=student, y=value, fill=test)) +
geom_bar(stat="identity") +
scale_fill_manual(values=c("brown4", "steelblue", "goldenrod3")) +
geom_text(aes(label=value), size =3, position=position_stack(vjust=0.5), colour="white") +
theme_classic() +
theme(text=element_text(family="serif", size=15, colour="black")) +
theme(axis.title=element_text(family="serif", size=15, colour="black")) +
theme(legend.title = element_blank()) +
theme(legend.position = c(0.2, 0.7)) +
stat_summary(fun.y = sum, aes(label = ..y.., group = student), geom = "text", vjust = -1) +
scale_y_continuous(limits = c(-4,20))
g
结果如下图:
没有负值的条的总和在条的顶部可以正常工作,但具有负值的条(学生 A)的总和位于红色条的中间。
我怎样才能解决这个问题?
解决方案
您fun.y = sum
用作汇总函数,它将y
组中的所有值相加,包括负值。这给出了标签的正确总和,但位置不好。对于位置计算,我们只想计算大于 0 的值的总和。
stat_summary
让我们指定最多 3 个函数,fun.y
、fun.ymin
和fun.ymax
。我们将修改fun.y
位置,使其成为正值的总和,我们将添加 afun.ymax
作为常规sum
并将其用于标签:
g = ggplot(data=dummy, aes(x=student, y=value, fill=test)) +
geom_bar(stat="identity") +
scale_fill_manual(values=c("brown4", "steelblue", "goldenrod3")) +
geom_text(aes(label=value), size =3, position=position_stack(vjust=0.5), colour="white") +
theme_classic() +
theme(text=element_text(family="serif", size=15, colour="black")) +
theme(axis.title=element_text(family="serif", size=15, colour="black")) +
theme(legend.title = element_blank()) +
theme(legend.position = c(0.2, 0.7)) +
stat_summary(fun.y = function(y) sum(y[y > 0]), fun.ymax = sum,
aes(label = ..ymax.., group = student), geom = "text", vjust = -1) +
scale_y_continuous(limits = c(-4,20))
g
推荐阅读
- node.js - 无法导出连接
- reactjs - ReactNative Expo 预加载和缓存图像
- python - Python - 按组列出来自日志和输出的数据并计算总数
- powerbi - 表格模型 - 按列排序:属性值无效的多个不同值
- c++ - 内部带有数字的动态 ASCII 框
- angular - errors.ts:30 错误错误:未捕获(在承诺中):错误:无法匹配任何路由。URL 段:'产品,%20productId'
- javascript - 根据jQuery中的函数参数创建一个显示所选属性和值的文本的函数
- python - Python从之前的两个类中继承一个类(机器学习预处理)
- java - Spring-security:有没有办法使用来自客户端的 cookie 验证 url 参数?
- python - Lambda Python 查询 SSM 参数存储值