如何使用 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 = "")
我被要求这样做,“为性别、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 = "")