Если вы хотите раскрасить точки и создать регрессионную линию по группам, вам нужно сопоставить эстетику с некоторой переменной.
В общем случае вы можете добавить сопоставление на верхний уровень, и это разделит все панели по группам.
ggpairs(iris, columns=1:4, mapping=aes(colour=Species))
Однако я думаю, что вам нужно проделать немного больше работы, если вы хотите построить график по группам только в одной части панели. Один из способов — сначала изменить вашу пользовательскую функцию на следующую. Это обеспечивает дополнительный параметр emap
, который будет управлять эстетикой только в lowerFn
.
lowerFn <- function(data, mapping, emap=NULL, method = "lm", ...) {
# mapping <- c(mapping, emap)
# class(mapping) = "uneval" # need this to combine the two aes
# Can use this instead
mapping <- ggplot2:::new_aes( c(mapping, emap))
p <- ggplot(data = data, mapping = mapping) +
geom_point() +
geom_smooth(method = method, ...) +
theme_classic() # to get the white background and prominent axis
p
}
Затем вы можете вызвать его следующим образом, что должно оставить диагональную и верхнюю эстетику в покое.
ggpairs(
iris, columns=1:4,
lower = list(continuous = wrap(lowerFn,
method = "lm", fullrange=TRUE, se=FALSE,
emap=aes(color=Species))))
Это производит
Конечно, вы можете просто жестко закодировать свою группирующую переменную в пользовательской функции:
lowerFn <- function(data, mapping, method = "lm", ...) {
p <- ggplot(data = data, mapping = mapping) +
geom_point(aes(colour=Species)) +
geom_smooth(method = method, aes(colour=Species), ...)
p
}
ggpairs(
iris, columns=1:4,
lower = list(continuous =
wrap(lowerFn, method = "lm",
fullrange=TRUE, se=FALSE)))
Комментарий: когда вы добавляете параметр colour
к geom_point
или geom_smooth
в своей пользовательской функции, он отменяет сопоставленный colour
, например. сравните результаты со следующими
ggplot(iris, aes(Sepal.Length, Sepal.Width, col=Species)) +
geom_smooth(se=FALSE)
ggplot(iris, aes(Sepal.Length, Sepal.Width, col=Species)) +
geom_smooth(col="red", se=FALSE)
Вопрос? Как ввести ключ для линии регрессии на графике?
Если бы вы использовали эстетику глобального / верхнего уровня, вы могли бы использовать ggpairs(iris, columns=1:4, aes(colour=Species), legend=1)
и обычные функции ggplot
theme
для управления ею. Здесь этого сделать нельзя, так как группирующая переменная использовалась в пользовательской функции. Однако пакет предоставляет средства для добавления пользовательских легенд с аргументом legend
; вы можете создать фиктивную легенду за пределами ggpairs
, а затем добавить ее во время построения графика.
leg <- grab_legend(ggplot(data=iris, aes(x=NA, y=NA, colour=Species)) +
geom_line() + theme(legend.direction = "horizontal"))
ggpairs(
iris, columns=1:4, legend=leg,
lower = list(continuous =
wrap(lowerFn, method = "lm",
emap=aes(color=Species),
fullrange=TRUE, se=FALSE))) +
theme(legend.position = "top")
person
user20650
schedule
17.02.2021