Как отобразить значения столбца внутри баров гистограммы - PullRequest
1 голос
/ 25 марта 2020

Используя код ниже, я мог бы создать график ниже. Я хотел бы выполнить некоторые настройки следующим образом:

1 - перетащите числа с начала меток в легенде (например, 4.Male NCG на Male NCG), но не меняйте порядок значений

2 - отобразить значения meanHLE_ внутри столбцов и определить с помощью новой легенды

3 отдельных мужских и женских категории на графике

What I have

# мои данные

sample_label<-c("4.Male NCG","4.Male NCG","4.Male NCG",
                    "5.Male caregivers<14h/w","5.Male caregivers<14h/w",
                    "5.Male caregivers<14h/w","6.Male caregivers>=14h/w",
                    "6.Male caregivers>=14h/w","6.Male caregivers>=14h/w",
                    "7.Female NCG","7.Female NCG","7.Female NCG", 
                    "8.Female caregivers<14h/w", "8.Female caregivers<14h/w",
                    "8.Female caregivers<14h/w", "9.Female caregivers>=14h/w",
                    "9.Female caregivers>=14h/w","9.Female caregivers>=14h/w")

        Age_Group_<-c("50-51","60-61","70-71","50-51","60-61","70-71",
                      "50-51","60-61","70-71","50-51","60-61","70-71",
                      "50-51","60-61","70-71","50-51","60-61","70-71")
        meanTLE_<-c(32.4,24,16.3,34.4,25.6,17.3,33.4,24.7,16.8,
                    36,26.8,18.1,37.3,27.9,18.8,36.6,27.3,18.5)
        meanHLE_<-c(24.8,18.3,12.3,27.2,20.2,13.6,25.3,18.7,12.6,
                    28.8,21.4,14.4,30.7,22.9,15.4,29.1,21.6,14.5)

2. Участок

gender<-data.frame(sample_label,Age_Group_,meanTLE_,meanHLE_)
ggplot(gender, aes(x =Age_Group_, y = meanTLE_, fill=sample_label)) + geom_bar(stat ="identity", position = "dodge2") + #fill = "#B61E2E"
  geom_text(
    aes(label = meanTLE_),
    vjust = 0,
    colour = "black", 
    position = position_dodge(width=0.9),
    fontface = "bold",
    size=3,
    angle = 90,
    hjust = 0
  ) +ylim(0,50)+

  labs(
    x = "Age Groups",
    y = "Total Life Expactacny",
    face = "bold"
  ) +
  # coord_flip() +
  theme_bw() +
  # scale_fill_manual(values=c("meanHLE_")) + 
  theme(legend.title=element_blank(),legend.text = element_text(face = "bold"),plot.title = element_text(
    hjust = 0.5,
    size = 15,
    colour = "Black",
    face = "bold"
  ),
  plot.caption = element_text(hjust = 0, color = "black", face = "bold", size=12.5))

1 Ответ

3 голосов
/ 26 марта 2020

Я думаю, что сюжет ниже делает большую часть того, что вы указали в своем ОП и комментариях. Тем не менее, я думаю, что этот график очень занят и шаблоны не настолько прозрачны, как могли бы, поэтому я добавил несколько других опций.

library(tidyverse)

pd = position_dodge(0.9)

gender %>% 
  mutate(sex=str_extract(sample_label, "Male|Female"),
         sample_label=gsub(".*ale ", "", sample_label),
         sample_label=fct_relevel(sample_label, "NCG")) %>% 
  ggplot(aes(x =Age_Group_, y = meanTLE_, fill=sample_label, group=sample_label)) + 
  # Dodge value labels and bars by same amount
  geom_col(position = pd, width=0.85) + 
  geom_text(aes(label=sprintf("%1.1f", meanTLE_)), hjust=0,
            colour = "black", fontface = "bold", size=3, angle = 90,
            # Dodge value labels and bars by same amount
            position = pd) + 
  geom_col(aes(y=meanHLE_), width=0.4, size=0.2, colour="grey50", fill="white", position=pd) +
  geom_text(aes(label=sprintf("%1.1f", meanHLE_), 
                y=meanHLE_, colour=sample_label), position=pd,
            colour = "black", fontface = "bold", size=3, angle = 90,) +
  geom_text(data=. %>% 
              group_by(sex) %>%
              filter(Age_Group_=="70-71", grepl(">=14", sample_label)) %>% 
              ungroup %>% 
              pivot_longer(starts_with("mean")), hjust=0, colour="grey30", size=3,
            aes(x=3.5, y=value, label=gsub("mean(.*)_", "\\1", name))) +
  facet_grid(cols=vars(sex)) +
  scale_y_continuous(limits=c(0,41), expand=c(0,0)) +
  expand_limits(x=3.9) +
  scale_colour_manual(values=hcl(seq(15,375,length=4)[1:3], 100, 80)) +
  labs(x = "Age Groups", y = "Total Life Expectancy") +
  theme_bw() +
  theme(legend.title=element_blank(),
        legend.text = element_text(face = "bold"),
        plot.title = element_text(hjust = 0.5, size = 15, colour = "Black", face = "bold"),
        plot.caption = element_text(hjust = 0, color = "black", face = "bold", size=12.5))

enter image description here

График ниже избавляет от столбцов и использует значения в качестве маркеров точек. Я изменил данные в длинный формат, так что нам нужен только один вызов для каждого geom, чтобы отобразить значения, и мы можем сгенерировать легенду с цветовым отображением. Я добавил тонкие линии только для того, чтобы направлять взгляд. Если вы хотите удалить их, установите size=0 в geom_line. Не избавляйтесь от вызова geom_line, так как это необходимо для генерации легенды.

gender %>% 
  mutate(sex=str_extract(sample_label, "Male|Female"),
         sample_label=gsub(".*ale ", "", sample_label)) %>% 
  pivot_longer(cols=starts_with("mean")) %>% 
  ggplot(aes(y=sample_label, x=value, colour=name, group=name)) + 
    geom_line(size=0.4, alpha=0.5) +
    geom_text(aes(label=sprintf("%1.1f", value)), 
              fontface = "bold", size=3, show.legend=FALSE) + 
    facet_grid(rows=vars(sex, Age_Group_)) +
    scale_x_continuous(limits=c(0,40), expand=c(0,0)) +
    scale_colour_discrete(labels=c("Healthy", "Total")) +
    labs(x = "Mean (years)",
         title="Life expectancy by age, sex, and caregiver status") +
    theme_bw() +
    theme(legend.title=element_blank(),
          axis.title.y=element_blank(),
          legend.text = element_text(face = "bold"),
          plot.title = element_text(hjust = 0.5, size = 15, face = "bold"),
          plot.caption = element_text(hjust=0, color="black", face="bold", size=12.5),
          strip.text.y=element_text(angle=0),
          legend.position="bottom",
          legend.box.margin=margin(t=-10)) +
    guides(colour=guide_legend(override.aes=list(size=3, alpha=1)))

enter image description here

Эта версия кажется мне быть наиболее прозрачным в отношении ключевых моделей в данных. Текстовые метки значений данных накладываются друг на друга, поэтому, возможно, более эффективны уклонение или использование точечных маркеров.

gender %>% 
  mutate(sex=str_extract(sample_label, "Male|Female"),
         sample_label=gsub(".*ale ", "", sample_label)) %>% 
  pivot_longer(cols=starts_with("mean")) %>% 
  ggplot(aes(y=value, x=Age_Group_, colour=sample_label)) + 
    geom_line(aes(linetype=name, group=interaction(name, sample_label)), 
              size=0.6, alpha=0.3) +
    geom_text(aes(label=sprintf("%1.1f", value)), size=3, show.legend=FALSE) + 
    facet_grid(cols=vars(sex)) +
    scale_y_continuous(limits=c(0,40), expand=c(0,0)) +
    scale_linetype_discrete(labels=c("Healthy", "Total")) +
    labs(x = "Age Group", y="years", 
         colour="Caregiver Status", linetype="Life Expectancy Type",
         title="Life expectancy by age, sex, and caregiver status") +
    theme_bw() +
    theme(legend.text = element_text(face = "bold"),
          plot.title = element_text(hjust = 0.5, size = 15, face = "bold"),
          plot.caption = element_text(hjust = 0, color = "black", face = "bold", size=12.5)) +
    guides(linetype=guide_legend(reverse=TRUE, override.aes=list(size=1)),
           colour=guide_legend(override.aes=list(size=1, alpha=1)))

enter image description here

...