Eu vi esses posts GGally :: ggpairs plotar sem linhas de grade ao plotar o coeficiente de correlação use ggpairs para criar este plot
Depois de ler, eu pude implementar esse hack https://github.com/tonytonov/ggally/blob/master/R/gg-plots.r e meu enredo se parece com isso
Eu acho que este é um bom resultado, mas não posso mudar as colors.
Um MWE é isto
library(ggally) # load the hack source("ggally_mod.R") # I saved https://github.com/tonytonov/ggally/blob/master/R/gg-plots.r as "ggally_mod.R" assignInNamespace("ggally_cor", ggally_cor, "GGally") ggpairs(swiss)
Agora eu quero correr
ggpairs(swiss, lower=list(continuous="smooth", wrap=c(colour="blue")), diag=list(continuous="bar", wrap=c(colour="blue")))
Mas as colors continuam as mesmas. Existe uma maneira de mudar as colors agora que os parâmetros não estão mais funcionando?
Você não está usando o wrap
corretamente – veja a vinheta para detalhes . Também para a diagonal você agora tem que usar a barDiag
(mas ggpairs
dá erros muito úteis para dizer isso)
Então, para o seu exemplo, podemos mudar a colour
dos pontos nos painéis inferiores e o fill
das barras abaixo
library(GGally) library(ggplot2) ggpairs(swiss[1:3], lower=list(continuous=wrap("smooth", colour="blue")), diag=list(continuous=wrap("barDiag", fill="blue")))
Entretanto, como a cor da suavidade é codificada (veja ggally_smooth
), para alterar sua cor você precisa definir sua própria function para passar. Então daqui
my_fn <- function(data, mapping, pts=list(), smt=list(), ...){ ggplot(data = data, mapping = mapping, ...) + do.call(geom_point, pts) + do.call(geom_smooth, smt) } # Plot ggpairs(swiss[1:4], lower = list(continuous = wrap(my_fn, pts=list(size=2, colour="red"), smt=list(method="lm", se=F, size=5, colour="blue"))), diag=list(continuous=wrap("barDiag", fill="blue")))
De maneira semelhante, aqui está uma maneira de definir uma nova function de correlação superior (semelhante ao que você tem)
cor_fun <- function(data, mapping, method="pearson", ndp=2, sz=5, stars=TRUE, ...){ data <- na.omit(data[,c(as.character(mapping$x), as.character(mapping$y))]) x <- data[,as.character(mapping$x)] y <- data[,as.character(mapping$y)] corr <- cor.test(x, y, method=method) est <- corr$estimate lb.size <- sz* abs(est) if(stars){ stars <- c("***", "**", "*", "")[findInterval(corr$p.value, c(0, 0.001, 0.01, 0.05, 1))] lbl <- paste0(round(est, ndp), stars) }else{ lbl <- round(est, ndp) } ggplot(data=data, mapping=mapping) + annotate("text", x=mean(x), y=mean(y), label=lbl, size=lb.size,...)+ theme(panel.grid = element_blank()) } ggpairs(swiss, lower=list(continuous=wrap("smooth", colour="blue")), diag=list(continuous=wrap("barDiag", fill="blue")), upper=list(continuous=cor_fun))
Você pode modificar alguns parâmetros de funções GGally usando wrap()
como explicado aqui . Mas nem todos os parâmetros são nomeados para wrap
para serem úteis. Por exemplo, se você tentar alterar a paleta padrão com uma escala de colors manual no wrap
poderá receber um erro como Error in wrap("cor",…) all parameters must be named arguments
. Nesse caso, você pode criar funções personalizadas para gerar qualquer tipo de object ggplot apropriado para as seções superior, inferior ou diagonal do gráfico de matriz.
No entanto, existe um atalho (mais seguro) se você quiser alterar alguns parâmetros (não nomeados nas funções GGally para serem agrupados) sem criar uma function personalizada para projetar um object ggplot. Você acabou de chamar uma function GGally já existente dentro de uma chamada de function, adicionando os parâmetros ggplot extras. Por exemplo, para fornecer uma cor de escala manual para três categorias (na nova coluna swiss $ groups):
swiss$groups <- gl(n = 3, k = 1, length = nrow(swiss), labels = c("A", "B", "C")) ggpairs(swiss, mapping = aes(colour = groups), columns = 1:6, upper = list(continuous = function(data, mapping, ...) { ggally_cor(data = data, mapping = mapping, size = 2) + scale_colour_manual(values = c("black", "dark green", "red"))}), lower = list(continuous = function(data, mapping, ...) { ggally_smooth(data = data, mapping = mapping, alpha = .2) + scale_colour_manual(values = c("black", "dark green", "red"))}), diag = list(continuous = function(data, mapping, ...) { ggally_barDiag(data = data, mapping = mapping, alpha = .5) + scale_fill_manual(values = c("black", "dark green", "red"))}))