我有一些带有一些文字的直方图,我试图将它作为相应类型的中心
df = read.table(text = " id year type amount 1 1991 HIIT 22 2 1991 inter 144 3 1991 VIIT 98 4 1992 HIIT 20 5 1992 inter 136 6 1992 VIIT 108 7 1993 HIIT 20 8 1993 inter 120 9 1993 VIIT 124 10 1994 HIIT 26 11 1994 inter 118 12 1994 VIIT 120 13 1995 HIIT 23 14 1995 inter 101 15 1995 VIIT 140 16 1996 HIIT 27 17 1996 inter 103 18 1996 VIIT 162 19 1997 HIIT 24 20 1997 inter 96 21 1997 VIIT 172 22 1998 HIIT 24 23 1998 inter 92 24 1998 VIIT 177 25 1999 HIIT 28 26 1999 inter 45 27 1999 VIIT 220 28 2000 HIIT 26 29 2000 inter 36 30 2000 VIIT 231", header = TRUE, sep = "") library(dplyr); library(ggplot2); library(scales); df %>% mutate(type = factor(type, levels = c("inter", "VIIT", "HIIT"))) %>% group_by(year) %>% mutate(ratio = amount/sum(amount), pos=cumsum(ratio)-ratio/2) %>% ggplot(aes(x=factor(year), y=ratio, fill=type)) + geom_bar(stat="identity") + geom_text(aes(y = pos, label = percent(pos)), size = 4) + scale_y_continuous(name="", labels = percent) + coord_flip()
我的情节看起来像:
你能帮我解决这个问题,因为我不知道怎么用position参数修复它
谢谢
我不确定你想要做什么,但假设你想要在栏的每个彩色片段中间的文字到
在酒吧的中心; 和
是一个有意义的数字显示酒吧的大小
要解决第一个问题,您需要type
在计算pos
值via 之前对数据进行排序cumsum
.
要修复第二个,你应该ratio
向标签美学展示,而不是pos
,除了作为放置标签的水平坐标之外,这不是一个有意义的数字.
df %>% mutate(type = factor(type, levels = c("inter", "VIIT", "HIIT"))) %>% group_by(year) %>% arrange(desc(type)) %>% mutate(ratio = amount / sum(amount), pos = cumsum(ratio) - ratio / 2) %>% ggplot(aes(x = factor(year), y = ratio, fill = type)) + geom_bar(stat = "identity") + geom_text(aes(y = pos, label = percent(ratio)), size = 4) + scale_y_continuous(name="", labels = percent) + coord_flip()
顺便说一句,这不是直方图,而是堆积的条形图.一个直方图是完全不同的东西.
正如评论中指出的那样,最近添加到ggplot2中position_stack
,将为您计算位置,而不是pos
在数据管道中创建变量.所以下面的代码可能是做整件事的一种更简洁的方法(给出相同的结果):
df %>% group_by(year) %>% mutate(type = factor(type, levels = c("inter", "VIIT", "HIIT"))) %>% mutate(ratio = amount / sum(amount)) %>% ggplot(aes(x = factor(year), y = ratio, fill = type)) + geom_bar(stat = "identity") + geom_text(aes(label = percent(ratio)), position = position_stack(vjust = 0.5), size = 4) + scale_y_continuous(name="", labels = percent) + coord_flip()