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