我想更改GGally
函数ggpairs
的调色板。当我尝试将ggplot命令添加到使用getPlot
返回的ggplot时,颜色不会改变。
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")
答案 0 :(得分:6)
事实证明,这是可能的!它需要查找源代码,但解决方案很容易实现。我们对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,因此+
表示法不能直接应用于任何方式。但是,提供了简单的解决方法here。交叉你的手指,然后......
ggplot <- function(...) ggplot2::ggplot(...) + scale_fill_brewer(palette="Set2")
ggpairs(diamonds[, 1:2], colour='cut')
答案 1 :(得分:6)
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))
来获取包含用户传递的代码的字符串,并将其附加到每个绘图调用:
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'))
答案 2 :(得分:2)
我觉得更改调色板的最简单的方法是修改其自己的绘图功能,因为它们会返回可以自由定制的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
自变量也可以用于绘图的其他部分。
答案 3 :(得分:0)
将矩阵图分配给一个变量,然后使用 for 循环遍历每个图似乎也能解决问题:
library(GGally)
plot.matrix <-ggpairs(iris,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.