I have a histogram with some text and I m trying to center it for the corresponding type
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()
My plot look like :
Can you help me to solve this problem because I have no idea how to fix it with the position parameter
Thanks
I'm not sure exactly what you're trying to do, but assume that you want the text in the middle of each colored segment of the bar to
To fix the first issue, you need to have the data sorted by type
before you calculate the pos
value via cumsum
.
To fix the second, you should be showing ratio
to the label aesthetic, not pos
, which is not a meaningful number other than being the horizontal coordinate to place the label.
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()
By the way, this isn't a histogram, it's a stacked filled bar chart. A histogram is something quite different.
As pointed out in the comments, the fairly recent addition to ggplot2, position_stack
, will calculate the position for you rather than creating pos
variable in your data pipeline. So the code below is perhaps a neater way of doing the whole thing (gives identical result):
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With