Saltar al contenido

¿Hay alguna manera de cambiar la paleta de colores para GGally::ggpairs usando ggplot?

Esta noticia ha sido evaluado por expertos para garantizar la exactitud de nuestra esta crónica.

Solución:

¡Resulta que esto es posible! Requiere buscar el código fuente, pero la solución surge con bastante facilidad. Estamos interesados ​​en ggpairs función, por lo que el primer paso es simplemente

ggpairs

Veamos si podemos encontrar algún mapeo aes para rellenar o colorear. Por supuesto,

combo_aes <- addAndOverwriteAes(aes_string(x = xColName, 
            y = yColName, ...), section_aes)

Podemos esperar que haga lo que dice. Dos notas importantes:

  • el color y el relleno aes deben estar contenidos en los puntos suspensivos para el ggpairs llamada

  • aes_string() se usa

Probemos esto:

ggpairs(diamonds[, 1:2], colour='cut')

ingrese la descripción de la imagen aquí

¡Excelente, ya casi llegamos! Solo necesitamos anular la paleta de colores. Tenga en cuenta que algo como usted propone

ggpairs(diamonds[, 1:2], colour='cut') + scale_fill_brewer(palette = "Set2")

no funcionará porque el objeto ggpairs no es un ggplot, por lo que el + notación no es directamente aplicable de ninguna manera. Sin embargo, la solución alternativa simple se proporciona aquí. Cruza los dedos y...

ggplot <- function(...) ggplot2::ggplot(...) + scale_fill_brewer(palette="Set2")
ggpairs(diamonds[, 1:2], colour='cut')

ingrese la descripción de la imagen aquí

actualizar:

GGally se actualizó nuevamente y el truco en esta respuesta además ya no funciona, pero finalmente hay una solución no pirateada: dado

scales <- scale_colour_brewer(type = 'qual') %+% scale_fill_brewer(type = 'qual')

puede hacer (de una manera con suerte preparada para el futuro)

for (row in seq_len(ps$nrow))
    for (col in seq_len(ps$ncol))
        ps[row, col] <- ps[row, col] + scales

vieja forma

El truco en la otra respuesta ya no funciona, ¡así que pirateemos uno nuevo!

La estructura interna de un ggpairs objeto es el conjunto de datos y una lista de cadenas:

> dta <- data.frame(a=1:6, b=7:12, c=c('f', 'g'))
> ps <- ggpairs(dta, 1:2, colour = 'c')
> str(ps)
List of 10
 $ data        :'data.frame':   2 obs. of  3 variables:
  ..$ a: int [1:2] 1 2
  ..$ b: int [1:2] 3 4
  ..$ c: int [1:2] 5 6
 $ columns     : int [1:3] 1 2 3
 $ plots       :List of 9
  ..$ : chr "ggally_densityDiag(ggally_data, ggplot2::aes(x = a, colour = c))"
  ..$ : chr "ggally_cor(ggally_data, ggplot2::aes(x = b, y = a, colour = c))"

[...]

 $ gg          : NULL
 - attr(*, "class")= chr [1:2] "gg" "ggpairs"

> ps

parcela antes

Para modificar el gráfico, las cadenas respectivas en el objeto de gráfico deben modificarse para incluir el comando adicional. Para esto, usamos deparse(substitute(argument)) conseguir un string que contiene el código que el usuario pasó, y agréguelo a cada llamada de trama:

add_to_plots <- function(pairs, modification) 
    str <- deparse(substitute(modification))
    pairs$plots <- lapply(pairs$plots, function(s) paste(s, '+', str))
    pairs


> add_to_plots(ps, scale_colour_brewer(type = 'qual'))

trazar después

Siento que la forma más sencilla de cambiar la paleta es modificar su propia función gráfica, ya que devuelven objetos ggplot2 que se pueden personalizar libremente.

Para cambiar la densidad en la diagonal, solo cambia la función correspondiente, ggally_densityDiag.


modified_density = function(data, mapping, ...) 

  ggally_densityDiag(data, mapping, ...) + scale_fill_brewer(type = "qual", palette = "Set2")

Luego, proporcione la nueva función a ggparis llamada de función, como se muestra a continuación,


ggpairs(iris, columns = 1:3,  aes(color = Species),
        diag = list(continuous = modified_density)) 

ingrese la descripción de la imagen aquí

Hay upper y lower argumentos que también se pueden usar para otras partes de la trama.

Recuerda que puedes dar difusión a este escrito si lograste el éxito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *