Соедините ggplot boxplots, используя линии и несколько факторов

Я пытаюсь соединить ggplot2 boxplots с geom_lines для нескольких факторов. До сих пор мне удалось соединить все поля с линиями, см. Прикрепленную картинку. Но я хочу связать единственные коробочные сюжеты по их соответствующему коэффициенту.

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

Например, для моей переменной FL я хочу соединить только эти два боксплота, не связывая их с остальными переменными. Аналогично для переменной RW, соединяющей эти два половых бокса без оставшихся остальных.

library("MASS")  
data(crabs)  
melt_crabs <- melt(crabs,id.var=c("sp","sex","index"))   
ggplot(melt_crabs, aes(x = variable, y = value)) +   geom_line(aes(group = index), size = 0.05, alpha = 0.7) +   geom_boxplot(aes(fill = sp), alpha = 0.5) + facet_grid(sex~.)

Кто-нибудь знает, как этого добиться? Надеюсь, я объясню себя самым понятным способом.

Большое спасибо и наилучшие пожелания,

2 ответа

Решение

Ответ @ Стибу, безусловно, самый быстрый и чистый способ получить желаемый результат. Основываясь на его ответе, поскольку для данной переменной графики больше не находятся рядом друг с другом, вы можете разместить каждый из них на отдельном графике. Это может быть легко путем лишь незначительной настройки facet_grid позвоните в код @ Стибу:

ggplot(melt_crabs, aes(x = interaction(sex, variable), y = value)) +
  geom_boxplot(aes(fill = sex), alpha = 0.5) +
  geom_line(aes(group = interaction(index, variable)),
            alpha = 0.5, colour = "darkgrey") +
  facet_grid(sp~variable,scales="free_x") +
  scale_x_discrete(labels = "")

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

Также я немного покопался, если вы хотите переместить верхнюю полосу вниз, это не так сложно. Адаптация кода из: Как отображать метки полос под графиком при огранке?

Мы получаем:

p<-ggplot(melt_crabs, aes(x = interaction(sex, variable), y = value)) +
  geom_boxplot(aes(fill = sex), alpha = 0.5) +
  geom_line(aes(group = interaction(index, variable)),
            alpha = 0.5, colour = "darkgrey") +
  facet_grid(sp~variable,scales="free_x") +
  scale_x_discrete(labels = "")

# Convert the plot to a grob
gt <- ggplotGrob(p)

# Get the positions of the panels in the layout: t = top, l = left, ...
panels <-c(subset(gt$layout, name == "panel", select = t:r))

# Get the strip grob & x-axis label grob
stripGrob = gtable_filter(gt, "strip-top")

#Replace x-axis ticks with strip
gt = gtable_add_grob(gt, stripGrob, t = max(panels$b)+1, l = min(panels$l), r = max(panels$r))

# remove the old strip
gt = gt[-(min(panels$t)-1), ]

grid.newpage()
grid.draw(gt)

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

Я не знаю, как соединить точки в том сюжете, который вы создали. Но я могу показать вам, как сделать что-то подобное.

Сложность состоит в том, что все точки, которые принадлежат паре боксплотов, имеют одинаковую координату X (то есть одно и то же значение для variable). Поэтому я использовал interaction(sex, variable) в качестве координаты x, так что каждый блок-график имеет свое собственное значение x. Это означает, однако, что парные боксы менее заметны. С другой стороны, соединительные линии работают в другом направлении.

Для того чтобы построить линии, они сгруппированы по interaction(index, variable), что означает, что точки данных связаны, когда они имеют одинаковые значения для index а также variable,

Хватит говорить, вот код:

ggplot(melt_crabs, aes(x = interaction(sex, variable), y = value)) +
    geom_boxplot(aes(fill = sex), alpha = 0.5) +
    geom_line(aes(group = interaction(index, variable)),
              alpha = 0.5, colour = "darkgrey") +
    facet_grid(sp~.) +
    scale_x_discrete(labels = rep(levels(melt_crabs$variable), each = 2))

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

Другие вопросы по тегам