Используя набор данных радужной оболочки в качестве примера, я хотел бы нарисовать коробчатую диаграмму (только для видов setosa) с Sepal.Length
по оси x и Petal.Length
по оси y. Однако для этого, во-первых, требуется объединение непрерывных Sepal.Length
данных по оси x в группы: Sepal.Length < 4.7, Sepal.Length 4.7 - 5, Sepal.Length 5 - 5.2 and Sepal.Length > 5.2.
Во-вторых, требуется группировка первой и третьей группы. Я попробовал код ниже, но это не работает. Мы ценим любые предложения. Спасибо.
library(ggplot2)
bin1 <- iris[iris$Sepal.Length < 4.7, ]
bin2 <- iris[iris$Sepal.Length >=4.7 & <5, ]
bin3 <- iris[iris$Sepal.Length >=5 & <5.2, ]
bin4 <- iris[iris$Sepal.Length >=5.2, ]
binA <- bin1 + bin3
order <- c(bin2, binA, bin4)
ggboxplot(iris[iris$Species == "setosa", ], x="Sepal.Length", y="Petal.Length") + scale_x_discrete(limits=order)
Я бы использовал функцию cut
, чтобы делать то, что делаете вы. После этого вы можете использовать fct_collapse
, чтобы изменить точки разреза. Вы можете сделать что-то вроде следующего:
library(dplyr)
library(forcats)
library(ggplot2)
iris %>%
filter(Species == "setosa") %>%
mutate(sub_species = cut(Sepal.Length, breaks = c(-Inf, 4.7, 5, 5.2, Inf))) %>%
mutate(sub_species = fct_collapse(sub_species,
combined = c("(-Inf,4.7]", "(5.2, Inf]"))) %>%
ggplot(aes(sub_species, Petal.Length))+
geom_boxplot()
И это даст вам желание, которое вы хотите.
В качестве альтернативы вы можете заменить функцию cut
и использовать случай dplyr
, когда функция будет выглядеть так:
iris %>%
filter(Species == "setosa") %>%
# Case when to cases
mutate(sub_a = case_when( Sepal.Length < 4.7~"A",
Sepal.Length < 5~ "B",
Sepal.Length < 5.2~ "C",
TRUE~"D")) %>%
# Collapse A and D
mutate(collapsed = ifelse(sub_a %in% c("A", "D"), "combined", sub_a)) %>%
ggplot(aes(collapsed, Petal.Length))+
geom_boxplot()
В комментарии OP вопрос был расширен, чтобы включить создание нескольких других подклассов. Чтобы решить эту проблему, я буду использовать функцию mutate
, чтобы создать несколько дополнительных подкатегорий, а затем использовать функцию gather
, чтобы собрать их все в один столбец, сохраняя при этом данные в каждом подклассе (например, сохраняя правильные подсчеты).
iris %>%
filter(Species == "setosa") %>%
# Case when to cases
mutate(sub_a = case_when( Sepal.Length < 4.7~"A",
Sepal.Length < 5~ "B",
Sepal.Length < 5.2~ "C",
TRUE~"D")) %>%
# Collapse A and D
mutate(collapsed1 = ifelse(sub_a %in% c("A", "C"), "A+C", sub_a)) %>%
mutate(collapsed2 = ifelse(sub_a %in% c("A", "C", "D"), "A+C+D", sub_a)) %>%
# Pull all the new categories together into a new column called subclass
gather(new_cat, subclass, sub_a:collapsed2) %>%
# Filter to desired
filter(subclass %in% c("B", "A+C", "D", "A+C+D")) %>%
ggplot(aes(subclass, Petal.Length))+
geom_boxplot()
Спасибо еще раз. Я столкнулся с другой проблемой, которую я хотел бы реализовать. В дополнение к графикам «B», «C» и «комбинированные», я хотел бы включить четвертое поле, состоящее из «A», «C» и «D» вместе взятых. После мутации я не мог понять, как это сделать. (Я больше знаком с неконвейерными сценариями.) Буду признателен за ваши предложения. Спасибо.
Чтобы быть полностью ясным, я хотел бы построить: «B», «A + C», «D», «A + C + D». Спасибо.
@SylviaRodriguez проверьте обновленный ответ. Я думаю, что это то, что вы хотите.
@SylviaRodriguez, нет проблем! Рад помочь.