如何用R的eulerr包绘制符合指定重叠比例的韦恩图?
问题分析
eulerr包的euler()函数通过最小化拟合误差生成韦恩图,当输入的集合大小与交集参数不完全符合圆形几何约束时,它会自动调整图形以接近输入值,这就是你设定的m被g覆盖的比例未精确呈现的原因。
解决方案:手动绘制精确符合覆盖比例的韦恩图
若需严格按照设定比例绘制,建议手动计算圆形的位置和半径,借助基础绘图工具或plotrix包实现:
步骤1:计算几何参数
根据面积与覆盖比例推导两个圆的半径及圆心距离:
# 安装并加载依赖包 if (!require(plotrix)) install.packages("plotrix") library(plotrix) # 你的原始参数 g_area <- 97.22 m_area <- 63.89 gm_overlap_prop_m <- 0.9015527 gm_area <- gm_overlap_prop_m * m_area # 计算圆的半径(面积=πr² → r=√(面积/π)) r_g <- sqrt(g_area / pi) r_m <- sqrt(m_area / pi) # 定义交集面积计算函数(基于圆形几何公式) intersection_area <- function(d, r1, r2) { if (d >= r1 + r2) return(0) if (d <= abs(r1 - r2)) return(min(r1^2, r2^2)*pi) theta1 <- acos((d^2 + r1^2 - r2^2)/(2*d*r1)) theta2 <- acos((d^2 + r2^2 - r1^2)/(2*d*r2)) (r1^2 * theta1 + r2^2 * theta2 - 0.5 * sqrt((-d + r1 + r2)*(d + r1 - r2)*(d - r1 + r2)*(d + r1 + r2))) * pi } # 求解圆心距离d:让交集面积等于目标值gm_area target_diff <- function(d) intersection_area(d, r_g, r_m) - gm_area sol <- uniroot(target_diff, interval = c(0, r_g + r_m)) center_dist <- sol$root
步骤2:绘制韦恩图
用计算出的参数绘制精确图形:
# 初始化绘图画布 plot(0, 0, type = "n", xlim = c(-r_g - 1, r_g + 1), ylim = c(-r_g - 1, r_g + 1), axes = FALSE, xlab = "", ylab = "", main = "Custom Venn Diagram with Exact Overlap") # 绘制g圆(左侧) draw.circle(-center_dist/2, 0, r_g, col = adjustcolor("steelblue", alpha.f = 0.3), border = "steelblue", lwd = 1.5) # 绘制m圆(右侧) draw.circle(center_dist/2, 0, r_m, col = adjustcolor("coral", alpha.f = 0.3), border = "coral", lwd = 1.5) # 添加标签与数值 text(-center_dist/2, 0, labels = paste0("g\n", round(g_area, 2)), cex = 1.2) text(center_dist/2, 0, labels = paste0("m\n", round(m_area, 2)), cex = 1.2) text(0, 0, labels = paste0("g&m\n", round(gm_area, 2)), cex = 1.2) # 添加覆盖比例标注 text(-r_g - 0.5, r_g, labels = paste0("m covered by g: ", round(gm_overlap_prop_m*100, 2), "%"), adj = 0, cex = 1)
补充说明
若坚持使用eulerr,可尝试调整拟合算法参数(如method = "Nelder-Mead"),但受限于圆形几何约束,很难完全匹配你设定的覆盖比例,手动绘制是最可靠的方式。
内容的提问来源于stack exchange,提问作者Laas
相关产品推荐
相关产品推荐

