R语言:VennDiagram包能否实现类似leaflet的自定义填充样式?
问题解答
核心差异:底层渲染机制不同
leaflet基于网页HTML/CSS渲染,所以能通过注入CSS字符串定制样式;但VennDiagram依赖R的grid绘图系统生成静态矢量/位图图形,不支持CSS语法,直接给fill参数传CSS字符串自然无效。
可行实现方案
方案1:修改VennDiagram生成的grid图形对象
VennDiagram返回的是grid图形对象,我们可以手动替换其中的填充属性为grid支持的交叉阴影图案,需要借助gridPatterns包实现:
library(shiny) library(VennDiagram) library(grid) library(gridPatterns) ui <- fluidPage( plotOutput("venn") ) server <- function(input, output, session ) { set.seed(20190708) genes <- paste("gene",1:1000,sep="") x <- list( A = sample(genes,300), B = sample(genes,525), C = sample(genes,440) ) display_venn <- function( x ) { grid.newpage() venn_object <- venn.diagram( x, filename=NULL, fill = c("red","blue","green") # 先占位,后续替换填充样式 ) # 定义不同颜色的交叉阴影图案 cross_hatch_A <- pattern("crosshatch", colour = "white", fill = "red", density = 0.3) cross_hatch_B <- pattern("crosshatch", colour = "white", fill = "blue", density = 0.3) cross_hatch_C <- pattern("crosshatch", colour = "white", fill = "green", density = 0.3) # 替换对应分组的填充属性 venn_object[[1]]$gp$fill <- cross_hatch_A venn_object[[2]]$gp$fill <- cross_hatch_B venn_object[[3]]$gp$fill <- cross_hatch_C grid.draw(venn_object) } output$venn <- renderPlot({ display_venn(x) }) } shinyApp(ui = ui, server = server)
方案2:改用ggVennDiagram + ggpattern(更直观)
如果可以切换工具包,基于ggplot2的ggVennDiagram配合ggpattern包能更便捷实现图案填充,语法更贴近常用的ggplot风格:
library(shiny) library(ggVennDiagram) library(ggpattern) ui <- fluidPage( plotOutput("venn") ) server <- function(input, output, session ) { set.seed(20190708) genes <- paste("gene",1:1000,sep="") x <- list( A = sample(genes,300), B = sample(genes,525), C = sample(genes,440) ) display_venn <- function( x ) { ggVennDiagram(x) + # 设置基础填充色 scale_fill_manual(values = c("A" = "red", "B" = "blue", "C" = "green")) + # 添加交叉阴影图案 geom_polygon_pattern( aes(pattern_fill = name), pattern = "crosshatch", pattern_colour = "white", pattern_density = 0.3, pattern_spacing = 0.05 ) + scale_pattern_fill_manual(values = c("A" = "red", "B" = "blue", "C" = "green")) } output$venn <- renderPlot({ display_venn(x) }) } shinyApp(ui = ui, server = server)
总结
VennDiagram本身不支持CSS注入的方式,但可以通过修改其生成的grid图形对象,或者改用ggVennDiagram+ggpattern的组合,来实现交叉阴影填充的需求。
内容的提问来源于stack exchange,提问作者Eddie Rowe
相关产品推荐
相关产品推荐

