Вот пример набора данных:
structure(list(SecondFactor = structure(c(NA, NA, NA, NA, 1L,
2L, 1L, 2L, 1L, 2L, 1L, 2L, 3L, 4L, 3L, 4L), levels = c("D_AMPER = 1",
"D_AMPER = 2", "E_DPT = 1", "E_DPT = 2"), class = "factor"),
FirstFactor = structure(c(1L, 2L, 7L, 8L, 1L, 1L, 2L, 2L,
3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L), levels = c("A_CONC = 1",
"A_CONC = 2", "B_TEMP = 1", "B_TEMP = 2", "C_PT = 1", "C_PT = 2",
"D_AMPER = 1", "D_AMPER = 2"), class = "factor"), y = c(31.7083333333333,
29.4583333333333, 29.2083333333334, 31.9583333333333, 29.5,
28.9166666666667, 33.9166666666667, 30, 22.0833333333334,
36.3333333333333, 39.5833333333333, 24.3333333333333, 29.4166666666667,
31.5833333333333, 31.75, 29.5833333333333), section = structure(c(1L,
1L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L
), levels = c("1", "2", "3", "4", "5"), class = "factor")), class = "data.frame", row.names = c(NA,
-16L))
Я хотел бы создать график эффектов, используя эти предполагаемые предельные средние значения, на одной диаграмме с использованием ggplot2. Это будет выглядеть примерно так (я вручную склеил это в Excel):
Но я совершенно застрял. Я могу получить все точки на графике, но они перекрываются. В идеале при этом не нужно использовать никаких дополнительных пакетов, кроме tidyverse и ggh4x.





Вот быстрый и простой подход, который можно сделать красивее, поиграв с темой. Я сопоставляю SecondFactor с group, чтобы линии соединялись, и добавляю его к label, чтобы линии были помечены.
ggplot(df, aes(FirstFactor, y, group = SecondFactor, label = SecondFactor)) +
geom_line() +
geom_point() +
geom_text(data = . %>% filter(FirstFactor == last(FirstFactor), .by = section)) +
facet_wrap(~section, nrow = 1, scales = "free_x")
Вы также можете ggrepel убрать расстояние между метками или geomtextpath наклеить метки вдоль самих строк.
В базовой графике, используя matplot в by, мы могли бы сделать что-то вроде этого.
png('foo.png', width=8.75, height=2, units = "in", res=300)
par(mfrow=c(1, length(unique(df$section))), mar=c(2, 0, 0, 0) + .75,
oma=c(0, 3, 0, 0))
by(df, ~section, \(x) {
clr <- c('red', 'green')
m <- matrix(x$y, ncol=nrow(x)/2, byrow=TRUE)
matplot(m, pch=20, type='o', col=clr,
lty=1, xlim=c(.625, 2.375), ylim=range(df$y), axes=FALSE, ann=FALSE)
if (length(lb <- levels(droplevels(x$SecondFactor)))) {
legend('topleft', pch=20, col=clr, legend=lb, bty='n', cex=.7,
y.intersp=1.3)
}
pu <- par()$usr
axis(1, pu[1:2], FALSE, tck=0)
segments(1:2, pu[3], 1:2, pu[3]*.965, xpd=TRUE)
mtext(levels(droplevels(x$FirstFactor)), 1, .75, at=1:2, cex=.6)
})
axis(2, axTicks(2), line=-.75, outer=TRUE, las=1, cex.axis=.95)
axis(2, par()$usr[3:4], line=-.75, outer=TRUE, tck=0, labels=FALSE)
mtext('y', 2, 1.5, TRUE, las=1, cex=.8, at=.6)
dev.off()
Спасибо, очень полезно увидеть это и в базовой графике!
Блестяще, спасибо!