Неправильные цвета для диаграммы Венна, когда площадь одного круга равна 0

#r #venn-diagram #eulerr

#r #диаграмма Венна #eulerr

Вопрос:

Почему цвет меняется, когда площадь одного круга равна 0 («A» = 0) по сравнению с тем, если она равна 0,1 («A» = 0,1) -> сравните пример 1 и 2. Также, если A и B равны 0, круг будет черным, а не зеленым (см. Пример 3)..

 library(eulerr)

# example 1
fit <- euler(c("A" = 0.1, "B" =  10, "Aamp;B" = 5))
p1 <- plot(fit,
          fills = list(fill = c("black", "blue", "green")),
          labels = F)
p1
  

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

 # example 2
fit <- euler(c("A" = 0, "B" =  10, "Aamp;B" = 5))
p2 <- plot(fit,
          fills = list(fill = c("black", "blue", "green")),
          labels = F)
p2 
  

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

 # example 3
fit <- euler(c("A" = 0, "B" =  0, "Aamp;B" = 5))
p3 <- plot(fit,
           fills = list(fill = c("black", "blue", "green")),
           labels = F)
p3
  

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

Редактировать:

Я нашел обходной путь с этим здесь (см. Ниже). Но порядок цветов, кажется, ведет себя очень странно. Предполагается, что A должен быть черным, B -> синим, а A amp; B -> зеленым. Если none равно 0, это правильный порядок -> c («черный», «синий», «зеленый»). Но если либо A, либо B равно 0, то порядок отличается, в основном только тем, как они отображаются слева направо на графике. странно….

 combo <- c(A=1, B = 10, "Aamp;B" = 1)
fit <- euler(combo)



p <- plot(fit,
          fills = list(fill = 
                         if (combo["A"] == 0) {
                           c("green", "blue")
                           
                         } else if (combo["B"] == 0)  {
                           c("black", "green")
                         } else {
                           c("black", "blue", "green")
                         }
          ),
          labels = F)

p
  

Ответ №1:

Редактировать: перечитывая ваш пост, eulerr работает так, как ожидалось.

  • p1 — A — черный, B — синий, перекрытие AB — зеленый
  • p2 — A черный, B синий, зеленого нет, так как A полностью внутри B, поэтому он просто черный
  • p3 — A черный, B синий, но поскольку A и B полностью перекрываются, A полностью находится поверх B, поэтому все черное.

Может быть, использовать прозрачность, как показано ниже:

 fit <- euler(c("A" = 0, "B" =  0, "Aamp;B" = 5))
p3 <- plot(fit, fills = list(fill = c("black", "blue", "green"), alpha = 0.4),
           legend = list(side = "right"))
p3
  

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


Оригинальный ответ, все еще актуальный для понимания цветов перекрытия…

Количество цветов должно соответствовать количеству наборов, в этом случае у нас есть только 2 набора: A и B, поэтому нам нужно всего 2 цвета, перекрывающиеся цвета генерируются путем «смешивания» перекрывающихся цветов набора, см.:

 # R version 4.0.2
# eulerr_6.1.0
library(eulerr) 

fit <- euler(c("A" = 1, "B" =  10, "Aamp;B" = 5))
plot(fit, fills = list(fill = c("red", "green")), legend = list(side = "right"))
  

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

 fit <- euler(c("A" = 0, "B" =  10, "Aamp;B" = 5))
plot(fit, fills = list(fill = c("red", "green")), legend = list(side = "right"))
  

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

Ответ №2:

Цвета используются по порядку. Если A=0 тогда нечего заполнять A , то область for B заполняется первым цветом (черным), а область for Aamp;B — вторым цветом ( blue ). В третьем примере, A и B оба не имеют заливки, поэтому Aamp;B вместо этого заполняется первым цветом.

Самое простое решение — просто удалить цвет (или несколько) из вектора, если у вас значение 0. Например.

 # example 2
fit <- euler(c("A" = 0, "B" =  10, "Aamp;B" = 5))
p2 <- plot(fit,
          fills = list(fill = c("blue", "green")),
          labels = F)
  

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

1. хм, хорошо, спасибо. поскольку мне нужно запустить несколько сотен диаграмм Венна, это не вариант. тогда нужно попытаться найти другое решение..

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

3. Я отредактировал свой первоначальный пример выше. каким-то образом это не просто заменяет первый цвет…

4. Спасибо. но я не совсем согласен с вами. 🙂 Я имею в виду, что не имеет смысла, что цвет в вашем примере в основном только оранжевый (если A = 0.000001), а когда A равно 0, он переключается на красный..