установите цвет категорий на диаграмме Венна в r

#r #ggplot2 #venn

#r #ggplot2 #venn

Вопрос:

Я использую ggVennDiagram для создания диаграммы Венна. Я хотел бы установить цвет категорий вручную. Вот что я пытаюсь, однако цвет линии границы кругов не изменяется.

 x <- list(A=1:5,B=2:7,C=3:6,D=4:9)
ggVennDiagram(x, label = "count", label_alpha = 0, 
          color =  c("A" = "yellow","B" ="steelblue",'C' = 'red', 'D' = 'black') ,
          set_color = c("A" = "yellow","B" ="steelblue", 'C' = 'red', 'D' = 'black'))  
 scale_fill_gradient(low = "#F4FAFE", high = "#4981BF")
 

Есть идеи, как я могу сопоставить цвета окружностей с названиями категорий?

Спасибо

Ответ №1:

Из ggVennDiagram документации это выглядит так, как будто вам нужно создать диаграмму Венна, а не использовать ggVennDiagram функцию. Возможно, эта адаптация из примера документации дает вам достаточно для работы…

Обновлено, чтобы включить комментарий OP для подсчета процентов.

 library(ggplot2)
library(ggVennDiagram)

x <- list(A=1:5,B=2:7,C=3:6,D=4:9)

venn <- Venn(x)
data <- process_data(venn)
ggplot()  
  # 1. region count layer
  geom_sf(aes(fill = count), data = venn_region(data))  
  # 2. set edge layer
  geom_sf(aes(color = name), data = venn_setedge(data), show.legend = TRUE, size = 2)  
  # 3. set label layer
  geom_sf_text(aes(label = name), data = venn_setlabel(data))  
  # 4. region label layer
  geom_sf_label(aes(label = paste0(count, " (", scales::percent(count/sum(count), accuracy = 2), ")")), 
                data = venn_region(data),
                size = 3)  
  scale_fill_gradient(low = "#F4FAFE", high = "#4981BF") 
  scale_color_manual(values = c("A" = "yellow","B" ="steelblue",'C' = 'red', 'D' = 'black'),
                     labels = c('D' = 'D = bdiv_human')) 
  theme_void()
 

Создано 2021-12-04 пакетом reprex (версия v2.0.1)

Комментарии:

1. Это выглядит хорошо. Do. вы знаете, как я также могу добавить долю (процент) пересечений к графику.

2. на самом деле на графике отображаются как число, так и процент.

3. Я думаю, что это делает.

Ответ №2:

ggVennDiagram Команда вызывает ggVennDiagram::plot_venn функцию для построения цветных областей. Вы можете изменить эту функцию в соответствии с вашими потребностями.
Смотрите ниже мое предложение.

 plot_venn <- function (x, show_intersect, set_color, set_size, label, label_geom, 
    label_alpha, label_color, label_size, label_percent_digit, 
    label_txtWidth, edge_lty, edge_size, ...)  {
    venn <- Venn(x)
    data <- process_data(venn)
    p <- ggplot()   geom_sf(aes_string(fill = "count"), data = data@region)   
        geom_sf(aes_string(color = "name"), data = data@setEdge, 
            show.legend = F, lty = edge_lty, size = edge_size, color = set_color)   
        geom_sf_text(aes_string(label = "name"), data = data@setLabel, 
            size = set_size, color = set_color)   theme_void()
    if (label != "none" amp; show_intersect == FALSE) {
        region_label <- data@region %>% dplyr::filter(.data$component == 
            "region") %>% dplyr::mutate(percent = paste(round(.data$count * 
            100/sum(.data$count), digits = label_percent_digit), 
            "%", sep = "")) %>% dplyr::mutate(both = paste(.data$count, 
            paste0("(", .data$percent, ")"), sep = "n"))
        if (label_geom == "label") {
            p <- p   geom_sf_label(aes_string(label = label), 
                data = region_label, alpha = label_alpha, color = label_color, 
                size = label_size, lineheight = 0.85, label.size = NA)
        }
        if (label_geom == "text") {
            p <- p   geom_sf_text(aes_string(label = label), 
                data = region_label, alpha = label_alpha, color = label_color, 
                size = label_size, lineheight = 0.85)
        }
    }
    if (show_intersect == TRUE) {
        items <- data@region %>% dplyr::rowwise() %>% dplyr::mutate(text = stringr::str_wrap(paste0(.data$item, 
            collapse = " "), width = label_txtWidth)) %>% sf::st_as_sf()
        label_coord = sf::st_centroid(items$geometry) %>% sf::st_coordinates()
        p <- ggplot(items)   geom_sf(aes_string(fill = "count"))   
            geom_sf_text(aes_string(label = "name"), data = data@setLabel, 
                inherit.aes = F)   geom_text(aes_string(label = "count", 
            text = "text"), x = label_coord[, 1], y = label_coord[, 
            2], show.legend = FALSE)   theme_void()
        ax <- list(showline = FALSE)
        p <- plotly::ggplotly(p, tooltip = c("text")) %>% plotly::layout(xaxis = ax, 
            yaxis = ax)
    }
    p
}
 

Затем вы можете запустить код:

 library(ggVennDiagram)
library(ggplot2)

# Replace the plot_venn function with the modified version
assignInNamespace(x="plot_venn", value=plot_venn, ns="ggVennDiagram")  

x <- list(A=1:5,B=2:7,C=3:6,D=4:9)
ggVennDiagram(x, label = "count", label_alpha = 0, 
          color =  c("A" = "yellow","B" ="steelblue",'C' = 'red', 'bdiv_human' = 'black') ,
          set_color = c("A" = "yellow","B" ="steelblue", 'C' = 'red', 'bdiv_human' = 'black'))  
 scale_fill_gradient(low = "#F4FAFE", high = "#4981BF")  
 scale_color_gradient(low = "#F4FAFE", high = "#4981BF")
 

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