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