如何使用 geom_pointrange 按降序绘制数据?

how to use geom_pointrange to plot data in descending order?

我被要求这样做,“为性别、passengerClass 和生存的每个组合绘制平均年龄的点图。使用 geom_pointrange,按年龄递减对点进行排序并确保标签是在 y 轴上。”。这是我的尝试,它产生的情节似乎不正确。

# the dataset given to me
TitanicSurvival %>% group_by(survived,passengerClass,sex) %>% 
  summarize(age=mean(age, na.rm=T)) %>%
  unite(survived, passengerClass, sex, col="group", remove = FALSE) -> age
glimpse(age)

# my attempt to plot
age %>% 
    unite(sex, passengerClass, survived, col="group", remove = FALSE) %>%
    ggplot(aes(x = age, y= group)) + 
    geom_dotplot(binwidth = 1) +
    geom_pointrange(aes(xmin = sort(age), xmax = sort(age)), orientation = "y")

如果您提供实际数据的(代表性部分),例如,这通常更容易重现。 dput(head(TitanicSurvival, 100)) 的输出。但由于这是一个相当受欢迎的数据集,我已经可以使用它了。

你的任务的确切措辞可能在这里导致了一些混乱 - geom_dotplot 本质上是直方图的变体,我相信目的是询问绘制数据点(通常 geom_point).指定 geom_pointrange 函数表示您还应该显示范围,但实际上并没有要求。

所以,这是我的看法。首先,我们准备好我们可能想要绘制的所有统计数据和标签。最棘手的一步是最后一步 - 根据平均年龄的顺序设置标签的因子水平,因此它们将按该顺序显示在 y-axis:

df_age <- TitanicSurvival %>% 
  group_by(survived, passengerClass, sex) %>% 
  dplyr::summarize(
    age_min = min(age, na.rm = TRUE),
    age_mean = mean(age, na.rm=TRUE),
    age_max = max(age, na.rm = TRUE),
    .groups = "drop"
    ) %>%
  dplyr::mutate(
    group_label = glue::glue("{sex}_{passengerClass}_{survived}"),
  ) %>%
  dplyr::arrange(age_mean) %>%
  dplyr::mutate(
    group_label = forcats::as_factor(group_label)
  )
# A tibble: 12 x 7
#   survived passengerClass sex    age_min age_mean age_max group_label   
#   <chr>    <chr>          <chr>    <dbl>    <dbl>   <dbl> <fct>         
# 1 yes      2nd            male     0.667     17.4      62 male_2nd_yes  
# 2 yes      3rd            female   0.167     20.8      63 female_3rd_yes
# 3 yes      3rd            male     0.417     22.4      45 male_3rd_yes  
# 4 no       3rd            female   1         23.4      48 female_3rd_no 

然后我们可以使用 geom_pointrange 绘制点(我们在设置因子水平时已经处理了正确的排序!):

ggplot(df_age, aes(x = age_mean, y = group_label)) + 
  geom_pointrange(aes(xmin = age_min, xmax = age_max)) +
  theme_bw() +
  labs(x = "Age / Years", y = "")