简体   繁体   中英

adjust geom_text() label position based on a condition in R

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM