在 r 中设置维恩图中类别的颜色

set the color of categories in venn diagram in r

我正在使用 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")

知道如何将圆线的颜色与类别名称相匹配吗?

谢谢

根据 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()

reprex package (v2.0.1)

于 2021-12-04 创建

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