Изменение цвета точек в группе с сохранением дрожания с помощью ggplot

Я использую R и ggplot для создания коробчатых диаграмм с наложением отдельных точек данных. На оси x есть две основные группы (var1 в sampleData). Вторая группа также имеет второстепенное деление (var2), которое я хотел бы обозначить заливкой точки. Я успешно сделал это с помощью функции new_scale_fill из пакета ggnewscale.

Однако, когда я это делаю, кажется, что дрожание изменяется таким образом, что все второстепенные точки деления (var2) группируются вместе слева и справа от прямоугольной диаграммы. Есть ли способ избежать этого и случайным образом сгруппировать все точки в группе var1?

Ниже приведены примеры данных и выходных графиков.

sampleData <- data.frame(numVal = c(rnorm(100)),
                         var1 = c(rep(c("x1", "x2"), each = 50)),
                         var2 = c(rep(c("x1","x2","x3"), times = c(50, 30, 20))),
                         var3 = c(rep(c("t1", "t2", "t3", "t4"), 25)))

ggplot(sampleData, aes(x = var1, y = numVal)) +
  geom_boxplot(aes(fill = var1), alpha = 0.7) +
  scale_fill_manual(values = c("red", "blue")) +
  new_scale_fill() +
  geom_point(aes(fill = var2), shape = 21,
             position = position_jitterdodge()) +
  scale_fill_manual(values = c("red", "blue", "white")) 
  theme(legend.position = "none")


Пример вывода


person mikeHoncho    schedule 15.12.2020    source источник


Ответы (1)


Вы можете попробовать аргумент dodge.width внутри функции position_jitterdodge. Установка dodge.width на ноль смешает синюю и белую точки.

ggplot(sampleData, aes(x = var1, y = numVal)) +
  geom_boxplot(aes(fill = var1), alpha = 0.7) +
  scale_fill_manual(values = c("red", "blue")) +
  new_scale_fill() +
  geom_point(aes(fill = var2), shape = 21,
             position = position_jitterdodge(dodge.width = 0)) +
  scale_fill_manual(values = c("red", "blue", "white")) 

введите описание изображения здесь

Изменить: третья переменная

Если вы поместите третью переменную на ось x, вам может потребоваться управлять взаимодействием между осью и аргументами заполнения. Вот идея:

ggplot(sampleData, aes(x = interaction(var1,var3), y = numVal)) +
  geom_boxplot(aes(fill = var1), alpha = 0.7) +
  scale_fill_manual(values = c("red", "blue")) +
  new_scale_fill() +
  geom_point(aes(fill = interaction(var1,var2)), shape = 21,
             position = position_jitterdodge(dodge.width = 0)) +
  scale_fill_manual(values = c("red", "blue", "white"),
                    labels = c("x1", "x2", "x3"),
                    name = "var2") +
  labs(x = "var3") +
  facet_grid(.~ var3, scale = "free_x", switch = "x") +
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        panel.spacing.x = unit(0, "lines"),
        strip.background = element_rect(fill = "transparent"))

введите описание изображения здесь

person tamtam    schedule 15.12.2020
comment
Это хороший ответ, спасибо. Хотя он работает в этом случае, он не работает в более сложном случае, например, если вы замените переменную оси x новым var3, чтобы у вас было несколько группировок двух переменных по оси x. - person mikeHoncho; 15.12.2020