我正在尝试创建一个维恩图,其中每个圆都有唯一的颜色,并且交点将这些颜色混合在一起。
我可以使用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")
但是结果很差:
颜色被洗掉了,并且交集的颜色没有像我想要的那样与右侧圆的颜色不同。我想要更接近此结果的照片:
如果有某种方法可以指定和填充十字路口,我可以这样做。我认为,原则上可以用geom_ribbon()
完成。但这似乎很痛苦,而且很棘手。所以我希望有一个更优雅的解决方案。
答案 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")