Соедините 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))