混合来自不同图层的颜色

时间:2018-07-19 21:45:17

标签: r ggplot2

我正在尝试创建一个维恩图,其中每个圆都有唯一的颜色,并且交点将这些颜色混合在一起。

我可以使用ggforce软件包制作圆圈。而且我可以通过将alpha的值设置为0.75来混合颜色:

library(ggplot2)
library(ggforce)

propositions <- data.frame(
  cirx = c(-.75   , .75),
  ciry = c(0      , 0),
  r    = c(1.5    , 1.5),
  labx = c(-2.25  , 2.25),
  laby = c(1      , 1),
  labl = c("A", "B")
)

ggplot(propositions) + 
  theme_void() + coord_fixed() +
  xlim(-3,3) + ylim(-2,2) +
  theme(panel.border = element_rect(colour = "black", fill = NA, size = 1)) +
  geom_circle(aes(x0 = cirx, y0 = ciry, r = r), fill = "red", alpha = .6, data = propositions[1,]) +
  geom_circle(aes(x0 = cirx, y0 = ciry, r = r), fill = "blue", alpha = .6, data = propositions[2,]) +
  geom_text(aes(x = labx, y = laby, label = labl), 
            fontface = "italic", size = 10, family = "serif")

但是结果很差:

enter image description here

颜色被洗掉了,并且交集的颜色没有像我想要的那样与右侧圆的颜色不同。我想要更接近此结果的照片:

enter image description here

如果有某种方法可以指定和填充十字路口,我可以这样做。我认为,原则上可以用geom_ribbon()完成。但这似乎很痛苦,而且很棘手。所以我希望有一个更优雅的解决方案。

1 个答案:

答案 0 :(得分:0)

以下是使用geom_ribbon()的解决方法。但是,这不是一个合适的解决方案,因为在不手动重新定义功能区的边界的情况下,它无法推广到其他形状和相交处。

总有一种方法可以使ggplot2自动完成跨层混合颜色的工作,对吗?

library(ggplot2)
library(ggforce)

x <- seq(-.75, .75, 0.01)

upper <- function(x) {
    a <- sqrt(1.5^2 - (x[x < 0] - .75)^2)
    b <- sqrt(1.5^2 - (x[x >= 0] + .75)^2)
    c(a,b)
}

lower <- function(x) {
    -upper(x)
}

ggplot() + 
    coord_fixed() + theme_void() +
    xlim(-3,3) + ylim(-2,2) +
    geom_circle(aes(x0 = -.75, y0 = 0, r = 1.5), fill = "red") +  
    geom_circle(aes(x0 = .75, y0 = 0, r = 1.5), fill = "blue") +  
    geom_ribbon(aes(x = x, ymin = upper(x), ymax = lower(x)), fill = "purple", colour = "black") +
    theme(panel.border = element_rect(colour = "black", fill = NA, size = 1)) +
    geom_text(aes(x = c(-2.25, 2.25), y = c(1, 1), label = c("A", "B")), 
              fontface = "italic", size = 10, family = "serif")

enter image description here