Есть ли способ изменить цветовую палитру для 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")
Ответы
Ответ 1
Оказывается, это возможно! Это требует поиска исходного кода, но решение получается довольно легко. Нас интересует функция ggpairs
, поэтому первый шаг - это просто
ggpairs
Посмотрим, можем ли мы найти какое-либо отображение aes для заполнения или цвета. Действительно,
combo_aes <- addAndOverwriteAes(aes_string(x = xColName,
y = yColName, ...), section_aes)
Мы можем надеяться, что он сделает то, что он говорит. Две важные заметки:
Попробуйте это:
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]()