Есть ли способ изменить цветовую палитру для GGally::ggpairs с помощью ggplot?

Я хотел бы изменить цветовую палитру для GGally функция ggpairs, Когда я пытаюсь добавить команды ggplot в ggplot, возвращенный с помощью getPlot, цвета не меняются.

my_pair_plot = ggpairs(dataset, color="var1")
getPlot(my_pair_plot,2,1) + scale_fill_brewer(palette = "Set2")

Попытка поместить команды ggplot непосредственно на ggpairs Функция приводит к ошибке.

ggpairs(dataset, color="var1") + scale_fill_brewer(palette = "Set2")

4 ответа

Решение

Оказывается, это возможно! Требуется поиск исходного кода, но решение приходит довольно легко. Мы заинтересованы в ggpairs функция, поэтому первый шаг просто

ggpairs

Давайте посмотрим, сможем ли мы найти какое-либо отображение aes для заполнения или цвета. В самом деле,

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

Мы можем надеяться, что он делает то, что говорит. Два важных замечания:

  • Цвет и заливка должны содержаться в многоточии для ggpairs вызов

  • aes_string() используется

Давайте попробуем это:

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

введите описание изображения здесь

Отлично, мы почти у цели! Нам просто нужно переопределить цветовую палитру. Обратите внимание, что что-то вроде вас предлагает

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

не будет работать, потому что объект ggpairs не является ggplot, поэтому + нотация напрямую не применима никоим образом. Тем не менее, простой обходной путь предоставляется здесь. Скрестите пальцы и...

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

введите описание изображения здесь

Обновить:

GGAlly был снова обновлен, и взлом в этом ответе также больше не работает, но, наконец, есть решение без взлома: дано

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

вы можете сделать (мы надеемся на будущее)

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

старый способ

Взлом в другом ответе больше не работает, так что давайте взломать новый!

Внутренняя структура ggpairs Объект - это набор данных и список строк:

> 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

сюжет перед

Чтобы изменить график, необходимо изменить соответствующие строки в объекте графика, чтобы включить дополнительную команду. Для этого мы используем deparse(substitute(argument)) чтобы получить строку, содержащую код, который передал пользователь, и добавить его к каждому вызову plot:

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'))

сюжет после

Мне кажется, что самый простой способ изменить палитру - это изменить ее собственную функцию построения графиков, поскольку они возвращают объекты ggplot2, которые можно свободно настраивать.

Чтобы изменить плотность по диагонали, просто измените соответствующую функцию, ggally_densityDiag.


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

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

Затем предоставьте новую функцию для ggparis вызов функции, как показано ниже,


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

Есть upper а также lower аргументы, которые можно использовать и для других частей сюжета.

Назначение графика матрицы переменной, а затем повторение каждого графика с помощью for-lopp также, похоже, помогает:

      iris.uci <- read.csv(url("http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"),header=FALSE)

colnames(iris.uci) <- c("sepal.length","sepal.width","petal.length","petal.width","species")

plot.matrix <-ggpairs(iris.uci,aes(color= species), upper = list(continuous = wrap("cor", size=6)))

for(i in 1:5) {
  for(j in 1:5){
    plot.matrix[i,j] <- plot.matrix[i,j] +
      scale_fill_brewer(palette = "Dark2") +
      scale_color_brewer(palette = "Dark2")
  }
}

plot.matrix

Пример взят из Schmuller (2018): R Projects for dummies, p. 149.

Другие вопросы по тегам