geom_bar:颜色渐变和交叉阴影(使用gridSVG),透明度问题

aur*_*ien 5 r ggplot2

使用这个很棒的ggplot包,我想要一个条形图,其中fill美学被映射到一个连续变量,实际上是qvalues,在它上面是一个纹理,实际上是条纹和交叉阴影.

颜色渐变很重要,因为它代表重要性,而纹理则显示类别"A","B"及其重叠.所以对角线分别以一种方式,相反的方式和交叉的阴影线.我知道维恩图可以完成这项工作,但我认为我们更容易看到35个样本和比较.

fill是微不足道的,然而,纹理是棘手的.在SO上,感谢@baptise(见这里这里)我设法用虚拟数据得到这个输出: 横杆

问题是十字架背景的透明度.如果有可能alphagrid.patternFill()功能上的后台工作那将是伟大的.不幸的是,在我手中它不起作用.

任何帮助都感激不尽.

这里可以加载虚拟数据:

dfso <- structure(list(Sample = c("S1", "S2", "S1", "S2", "S1", "S2"), 
  qvalue = c(14.704287341, 8.1682824035, 13.5471896224, 6.71158432425, 
  12.3900919038, 5.254886245), type = structure(c(1L, 1L, 2L, 
  2L, 3L, 3L), .Label = c("A", "overlap", "B"), class = "factor"), 
  value = c(897L, 1082L, 503L, 219L, 388L, 165L)), class = c("tbl_df", 
  "tbl", "data.frame"), row.names = c(NA, -6L), .Names = c("Sample", 
  "qvalue", "type", "value"))
Run Code Online (Sandbox Code Playgroud)

代码在这里:

library("ggplot2")
library("gridSVG")
library("gridExtra")
library("dplyr")
library("RColorBrewer")

cols <- brewer.pal(7,"YlOrRd")
pso <- ggplot(dfso)+
  geom_bar(aes(x = Sample, y = value, fill = qvalue, linetype = type), width = .8, colour = "black", stat = "identity", position = "stack", alpha = 1)+
  theme_classic(18)+
  theme( panel.grid.major = element_line(colour = "grey80"),
     panel.grid.major.x = element_blank(),
     panel.grid.minor = element_blank(),
     legend.key = element_blank(),
     axis.text.x = element_text(angle = 90, vjust = 0.5))+
  guides(linetype = FALSE) +
  ylab("Count")+
  scale_fill_gradientn("-log10(qvalue)", colours = cols, limits = c(0, 20))+
  scale_linetype_manual(values = c("dotted", "solid", "dotted"))+
  scale_y_continuous(expand = c(0, 0), limits = c(0, 2000))

# gridSVG
pat1 <- pattern(linesGrob(gp = gpar(col="black", lwd = 1)),
                width = unit(5, "mm"), height = unit(5, "mm"),
                dev.width = 1, dev.height = 1)
pat2 <- pattern(linesGrob(x = unit(0:1, "npc"), y = unit(1:0, "npc"),
                          gp = gpar(col="black", lwd = 1)),
                width = unit(5, "mm"), height = unit(5, "mm"),
                dev.width = 1, dev.height = 1)
crossGrob <- gTree(children = gList(linesGrob(gp = gpar(col="black", lwd = 1)), linesGrob(x = unit(0:1, "npc"), y = unit(1:0, "npc"), gp = gpar(col="black", lwd = 1))))
registerPatternFill("hash1", pat1)
registerPatternFill("hash2", pat2)
registerPatternFill("cross", grob = crossGrob, dev.width = 1, dev.height = 1, width = unit(5, "mm"), height = unit(5, "mm"))
gridsvg("crossbars.svg", width = 10)
print(pso)
grid.force()
grid.patternFill("geom_rect.rect", alpha = 0.2, grep = TRUE, group = FALSE,
                 label = rep(c("hash1", "cross", "hash2"), 1))
dev.off()
Run Code Online (Sandbox Code Playgroud)

grid.patternFillalpha参数是假设给透明度,据我的理解它.但是,它没有效果,颜色也会丢失.我只为第一个条填充了图案,因此您可以看到对比度.

编辑:alpha工作正常,但它作用于模式本身,线条.这就解释了为什么线条看起来很苍白.问题更多的是背景被假定为白色而没有透明度.

linetype映射试图突出重叠部分,但它并不好.如果透明度适用于gridSVG我,我将丢弃此部分并保持一条实线.

提前谢谢了,

的Aurelien

如果有任何用途,输出sessionInfo():

R version 3.2.1 (2015-06-18)
Platform: x86_64-apple-darwin14.3.0 (64-bit)
Running under: OS X 10.10.4 (Yosemite)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods   base     
other attached packages:
[1] gridExtra_0.9.1    RColorBrewer_1.1-2 dplyr_0.4.1        gridSVG_1.4-3      ggplot2_1.0.1     
loaded via a namespace (and not attached):
 [1] Rcpp_0.11.6      XML_3.98-1.3     assertthat_0.1   digest_0.6.8     MASS_7.3-42      plyr_1.8.3       DBI_0.3.1       
 [8] gtable_0.1.2     magrittr_1.5     scales_0.2.5     stringi_0.5-5    reshape2_1.4.1   labeling_0.3     proto_0.3-10    
[15] RJSONIO_1.3-0    tools_3.2.1      stringr_1.0.0    munsell_0.4.2    parallel_3.2.1   colorspace_1.2-6
Run Code Online (Sandbox Code Playgroud)

aur*_*ien 5

我正在回答我自己的问题,因为有一种方法可以将特定颜色填充到模式中,感谢此链接.在第一个栏上,对于"A"类,它可能如下所示: 交叉

pat1通过以下代码替换模式:

pat1 <- pattern(gTree(children=gList(
                      rectGrob(gp=gpar(col=NA, fill=cols[4])),
                      linesGrob(gp=gpar(col="black", lwd = 5)))),
                      width = unit(5, "mm"), height = unit(5, "mm"),
                      dev.width = 1, dev.height = 1)
Run Code Online (Sandbox Code Playgroud)

对于geom_bar颜色很少的颜色,它可以工作,但对于我的问题,fill颜色被映射到热图规模,它将是乏味的.


tim*_*lio 2

这并不是真正的答案,但我将提供以下代码作为可能想了解我们如何完成此任务的人的参考。现场版本在这里d3我几乎认为完全使用或构建的库会更容易d3

library("ggplot2")
library("gridSVG")
library("gridExtra")
library("dplyr")
library("RColorBrewer")

dfso <- structure(list(Sample = c("S1", "S2", "S1", "S2", "S1", "S2"), 
                       qvalue = c(14.704287341, 8.1682824035, 13.5471896224, 6.71158432425, 
                                  12.3900919038, 5.254886245), type = structure(c(1L, 1L, 2L, 
                                                                                  2L, 3L, 3L), .Label = c("A", "overlap", "B"), class = "factor"), 
                       value = c(897L, 1082L, 503L, 219L, 388L, 165L)), class = c("tbl_df", 
                                                                                  "tbl", "data.frame"), row.names = c(NA, -6L), .Names = c("Sample", 
                                                                                                                                           "qvalue", "type", "value"))

cols <- brewer.pal(7,"YlOrRd")
pso <- ggplot(dfso)+
  geom_bar(aes(x = Sample, y = value, fill = qvalue), width = .8, colour = "black", stat = "identity", position = "stack", alpha = 1)+
  ylim(c(0,2000)) + 
  theme_classic(18)+
  theme( panel.grid.major = element_line(colour = "grey80"),
         panel.grid.major.x = element_blank(),
         panel.grid.minor = element_blank(),
         legend.key = element_blank(),
         axis.text.x = element_text(angle = 90, vjust = 0.5))+
  ylab("Count")+
  scale_fill_gradientn("-log10(qvalue)", colours = cols, limits = c(0, 20))

# use svglite and htmltools
library(svglite)
library(htmltools)

# get the svg as tag
pso_svg <- htmlSVG(print(pso),height=10,width = 14)

browsable(
  attachDependencies(
    tagList(
      pso_svg,
      tags$script(
        sprintf(
"
  var data = %s

  var svg = d3.select('svg');

  svg.select('style').remove();

  var bars = svg.selectAll('rect:not(:last-of-type):not(:first-of-type)')
     .data(d3.merge(d3.values(d3.nest().key(function(d){return d.Sample}).map(data))))

  bars.style('fill',function(d){
    var t = textures
              .lines()
              .background(d3.rgb(d3.select(this).style('fill')).toString());

    if(d.type === 'A') t.orientation('2/8');
    if(d.type === 'overlap') t.orientation('2/8','6/8');
    if(d.type === 'B') t.orientation('6/8');

    svg.call(t);
    return t.url();
  });
"    
          ,
          jsonlite::toJSON(dfso)
        )
      )
    ),
    list(
      htmlDependency(
        name = "d3",
        version = "3.5",
        src = c(href = "http://d3js.org"),
        script = "d3.v3.min.js"
      ),
      htmlDependency(
        name = "textures",
        version = "1.0.3",
        src = c(href = "https://rawgit.com/riccardoscalco/textures/master/"),
        script = "textures.min.js"
      )
    )
  )
)
Run Code Online (Sandbox Code Playgroud)