繁体   English   中英

如何在 ggpairs (R) 中显示带有 scale_colour_manual 的彩色组相关性?

[英]How to display coloured group correlations with scale_colour_manual in ggpairs (R)?

我将 ggpairs 用于 3 个组的数据。 问题是并非所有变量都具有所有组,因此,一些相关性只需要显示 2 个组。 由于 ggpairs 自动按字母顺序对组进行排序,因此着色不一致。 第一种颜色始终分配给第一个因子水平。 (例如:第 1 组 = 红色,第 2 组 = 蓝色,第 3 组 = 绿色。但变量只有第二组和最后一组:第 2 组 = 红色,第 3 组 = 蓝色。)

我尝试通过以下方式添加 scale_colour_manual 来自己解决这个问题:

scale_colour_manual(values = c("group1"="#F8766D", "group2"="#00BA38", "group3"="#619CFF"))

这似乎适用于对角线上的密度图(ggally_densityDiag)和下部的散点图(ggally_points),但对于相关性(ggally_cor)我只得到总体(黑色)相关性而没有彩色组相关性了。 虽然它们之前显示过,但是颜色和组的匹配错误。 为什么它们不再显示了?

以下代码生成此阴谋 ,颜色和组不匹配。

ggpairs(output.b[,c(13,17,18)], aes(colour = as.factor(output.b$country), alpha = 0.4),
upper = list(continuous = function(data, mapping, ...) {
  ggally_cor(data = output.b, mapping = mapping) + scale_colour_manual(values = c("#F8766D", "#00BA38", "#619CFF"))}),
lower = list(continuous = function(data, mapping, ...) {
  ggally_points(data = output.b, mapping = mapping) + scale_colour_manual(values = c("#F8766D", "#00BA38", "#619CFF"))}),
diag = list(continuous = function(data, mapping, ...) {
  ggally_densityDiag(data = output.b, mapping = mapping) + scale_fill_manual(values = c("#F8766D", "#00BA38", "#619CFF"))}))

改编后的代码生成了这个阴谋 ,彩色组相关性不再显示。

ggpairs(output.b[,c(13,17,18)], aes(colour = as.factor(output.b$country), alpha = 0.4),
upper = list(continuous = function(data, mapping, ...) {
  ggally_cor(data = output.b, mapping = mapping) + scale_colour_manual(values = c("group1"="#F8766D", "group2"="#00BA38", "group3"="#619CFF"))}),
lower = list(continuous = function(data, mapping, ...) {
  ggally_points(data = output.b, mapping = mapping) + scale_colour_manual(values = c("group1"="#F8766D", "group2"="#00BA38", "group3"="#619CFF"))}),
diag = list(continuous = function(data, mapping, ...) {
  ggally_densityDiag(data = output.b, mapping = mapping) + scale_fill_manual(values = c("group1"="#F8766D", "group2"="#00BA38", "group3"="#619CFF"))}))

[更新] 经过大量搜索和尝试,我发现了问题,但未能解决。 要将上部相关性中“group3:”的颜色更改为蓝色,我必须隔离这些图并执行 scale_colour_manual,如以下代码所示:

p <- ggpairs(...)
p[1,2] <- p[1,2] + scale_colour_manual("group3: 0.113" = "#F8766D")
p[1,3] <- p[1,3] + scale_colour_manual("group3: 0.268" = "#F8766D")

手动完成所有这些操作太麻烦了,因为我必须用不同的分组制作其中的几个图,而且我有更多的变量......有没有办法在 ggally_cor 中自动实现这个?

我遇到过同样的问题。 我只是从头开始重新编写了一个更好版本的 ggally_cor 函数。 您唯一需要做的就是在 scale_color_manual 中指定“Overall Corr”="black"

library(dplyr)
library(ggplot2)
library(GGally)

# set dplyr functions
select <- dplyr::select; rename <- dplyr::rename; mutate <- dplyr::mutate; 
summarize <- dplyr::summarize; arrange <- dplyr::arrange; slice <- dplyr::slice; filter <- dplyr::filter; recode<-dplyr::recode

# remove obs for setosa
data = iris %>% mutate(Sepal.Length = ifelse(Species=="setosa",NA,Sepal.Length))

mycorrelations <- function(data,mapping,...){
    data2 = data
    data2$x = as.numeric(data[,as_label(mapping$x)])
    data2$y = as.numeric(data[,as_label(mapping$y)])
    data2$group = data[,as_label(mapping$colour)]
    
    correlation_df = data2 %>% 
        bind_rows(data2 %>% mutate(group="Overall Corr")) %>%
        group_by(group) %>% 
        filter(sum(!is.na(x),na.rm=T)>1) %>%
        filter(sum(!is.na(y),na.rm=T)>1) %>%
        summarize(estimate = round(as.numeric(cor.test(x,y,method="spearman")$estimate),2),
                  pvalue = cor.test(x,y,method="spearman")$p.value,
                  pvalue_star = as.character(symnum(pvalue, corr = FALSE, na = FALSE, 
                                                    cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1), 
                                                    symbols = c("***", "**", "*", "'", " "))))%>%
        group_by() %>%
        mutate(group = factor(group, levels=c(as.character(unique(sort(data[,as_label(mapping$colour)]))), "Overall Corr")))
    
    ggplot(data=correlation_df, aes(x=1,y=group,color=group))+
        geom_text(aes(label=paste0(group,": ",estimate,pvalue_star)))
}


ggpairs(data,columns=1:4,
        mapping = ggplot2::aes(color=Species), 
        upper = list(continuous = mycorrelations))+
    scale_color_manual(values=c("setosa"="orange","versicolor"="purple","virginica"="brown","Overall Corr"="black"))

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM