I am trying to replicate below chart that is originally made in python on kaggle:
This is the df I am using: chart_longer_df
age gender gender_count
<chr> <chr> <dbl>
1-17 Men 45
1-17 Women 17
18-25 Men 50
18-25 Women 20
26-35 Men 55
26-35 Women 22
36-45 Men 35
36-45 Women 12
46-60 Men 20
46-60 Women 5
61-80 Men 10
61-80 Women 2
80-100 Men 8
80-100 Women 0
To create that chart, created below code:
chart_longer_df %>%
# making Women gender to negative values to stack gender around 0
mutate(gender_count2 = case_when(gender == "Women" ~ gender_count * -1,
TRUE ~ gender_count)) %>%
ggplot(aes(x = as.factor(age), y = gender_count2, fill = gender)) +
geom_col(width = 0.52) +
theme_classic() +
geom_text(aes(label = gender_count), col = "black", nudge_y = 2, size = 5) +
scale_fill_manual(values = c("darkblue","maroon")) +
labs(title = "Age / gender distribution" ) +
theme(plot.title = element_text(size = 25),
axis.title = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
axis.text = element_text(size = 15),
axis.line = element_blank()
)
ISSUE: I have tried to adjust labels position out of the bars based on condition if positive value then nudge_y = 2 else -2
but its giving error.
chart_longer_df %>%
mutate(gender_count2 = case_when(gender == "Women" ~ gender_count * -1,
TRUE ~ gender_count)) %>%
ggplot(aes(x = as.factor(age), y = gender_count2, fill = gender)) +
geom_col(width = 0.52) +
theme_classic() +
geom_text(aes(label = gender_count), col = "black", size = 5,
# Added this condition here neither working as gender_count2 nor with.$
nudge_y = case_when(.$gender_count2 > 0 ~ 2,
TRUE ~ -2) ) +
scale_fill_manual(values = c("darkblue","maroon")) +
labs(title = "Age / gender distribution" ) +
theme(plot.title = element_text(size = 25),
axis.title = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
axis.text = element_text(size = 15),
axis.line = element_blank()
)
Also tried by changing condition to gender == "Women"
but that is also not working, seems like some silly mistake but not able to figure out.
chart_longer_df %>%
mutate(gender_count2 = case_when(gender == "Women" ~ gender_count * -1,
TRUE ~ gender_count)) %>%
ggplot(aes(x = as.factor(age), y = gender_count2, fill = gender)) +
geom_col(width = 0.52) +
theme_classic() +
geom_text(aes(label = gender_count), col = "black", size = 5,
nudge_y = case_when(.$gender == "Women" ~ 2,
TRUE ~ -2) ) +
scale_fill_manual(values = c("darkblue","maroon")) +
labs(title = "Age / gender distribution" ) +
theme(plot.title = element_text(size = 25),
axis.title = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
axis.text = element_text(size = 15),
axis.line = element_blank()
)
Error:
Error in eval_tidy(pair$lhs, env = default_env): object '.' not found
Traceback:
1. geom_text(aes(label = gender_count), col = "black", size = 5,
. nudge_y = case_when(.$gender == "Women" ~ 2, TRUE ~ -2))
2. position_nudge(nudge_x, nudge_y)
3. ggproto(NULL, PositionNudge, x = x, y = y)
4. case_when(.$gender == "Women" ~ 2, TRUE ~ -2)
5. eval_tidy(pair$lhs, env = default_env)
Instead of using nudge_y
, change y
axis value in aes
of geom_text
:
library(dplyr)
library(ggplot2)
chart_longer_df %>%
mutate(gender_count2 = case_when(gender == "Women" ~ gender_count * -1,
TRUE ~ as.numeric(gender_count))) %>%
ggplot(aes(x = as.factor(age), y = gender_count2, fill = gender)) +
geom_col(width = 0.52) +
theme_classic() +
geom_text(aes(label = gender_count,y = gender_count2 +sign(gender_count2) * 3),
col = "black", size = 5) +
scale_fill_manual(values = c("darkblue","maroon")) +
labs(title = "Age / gender distribution" ) +
theme(plot.title = element_text(size = 25),
axis.title = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
axis.text = element_text(size = 15),
axis.line = element_blank()
)
Did some playing around with y-axis value before finally settling to multiply by 3.
Thanks @Ronak Shah, you have solution to everything. Saw that you have youtube channel as well. Keep posting new learning videos & i wll start following as I have lot to learn from you!