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

Есть ли способ изменить цветовую палитру для 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")
4b9b3361

Ответ 1

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

ggpairs

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

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

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

  • цвет и заливка aes должны содержаться в эллипсисе для вызова ggpairs

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

Попробуйте это:

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

enter image description here

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

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

enter image description here

Ответ 2

обновление:

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

plot before

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

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

plot after