Как отобразить цветные групповые корреляции с помощью scale_colour_manual в ggpairs (R)?

#r #ggplot2 #ggally #scale-color-manual #ggpairs

#r #ggplot2 #ggally #масштаб-цвет-руководство #ggpairs

Вопрос:

Я использую 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"))}))
  

Ответ №1:

[ОБНОВЛЕНИЕ] После долгих поисков и попыток я обнаружил проблему, но не смог ее решить. Чтобы изменить цвет ‘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?

Ответ №2:

У меня была такая же проблема. Я только что переписал лучшую версию функции ggally_cor с нуля. Единственное, что вам нужно сделать, это указать «Общий Corr»=»черный» в scale_color_manual

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

введите описание изображения здесь