使用plotly_build调整geom_text标签

时间:2016-06-20 19:00:18

标签: r ggplot2 plotly geom-bar

我正在使用ggplot2plotlyggthemes创建数据汇总条形图。这是我的代码:

# data
dput(dat)

structure(list(Source = structure(1:11, .Label = c("GTEx", "Target", 
"RNASeq", "Microarray", "CNA", "Mutation", "HI51", "IH250", "IH251", 
"NB88", "OBER649"), class = "factor"), Type = c("External", "External", 
"Cell Line", "Cell Line", "Cell Line", "Cell Line", "Patient Sample", 
"Patient Sample", "Patient Sample", "Patient Sample", "Patient Sample"
), Samples = c(1641, 162, 41, 29, 34, 29, 51, 250, 251, 88, 649
), Genes = c(52576, 25818, 26770, 19822, 21376, 12716, 21118, 
17768, 17768, 21118, 19858)), .Names = c("Source", "Type", "Samples", 
"Genes"), class = "data.frame", row.names = c(NA, -11L))

library(ggplot2)
library(ggthemes)
library(plotly)
p <- ggplot(data = dat, aes(x = Source, y = Genes)) + 
                      geom_bar(stat="identity",aes(color = Type)) + 
                      theme_bw() + 
                      geom_text(aes(label = Samples, color = Type), position=position_dodge(width=0.9), vjust=-0.25, size=5) + 
                      theme_hc(bgcolor = "darkunica") +
                      scale_colour_hc("darkunica") +
                      theme(axis.title = element_blank(), 
                            axis.text.y = element_blank(), 
                            axis.ticks = element_blank(), 
                            panel.grid = element_blank())
p <- plotly_build(p)
p$layout$plot_bgcolor <- p$layout$paper_bgcolor
p$layout$annotations[[1]]$text <- ""

这是创建的情节:

enter image description here

条形图上的标签显示样本数量。当我将鼠标悬停在它上方时,会显示SourceGenesType。即使我在position中使用vjustgeom_text个参数,它也无效。如何调整条形上的标签,使它们可见,即完全在条形图上方或条形图下方?

1 个答案:

答案 0 :(得分:1)

使用你的数据我完成了直到plotly_build的阶段。(没有黑暗的主题)

如果你检查你的情节对象,它有两个类别:数据和布局。 图的文本元素是“散射”类型,具有与条形相同的x,y属性。因此,它们与你的酒吧重叠。

p$data[[1]]$type   ## Prints result as "bar" type for dat$Type "Cell Line"
p$data[[4]]$type   ## Prints result as "scatter" for dat$Type "Cell Line"
p$data[[4]]$mode   ## Prints text's mode as "text"
P$data[[1]]$mode   ## Prints bar's mode as NULL

在情节上,geom_text没有很好地转换为情节图表。 您需要更改散点图类型的$ y(y轴坐标)(此处文本被映射为散点图类型)。

p$data[[4]]$y 
[1] 26770 19822 21376 12716

由于您的y轴缩放到dat $ Genes(范围从0到52576),因此将其坐标增加/减少到1或10不会导致明显的差异。因此,您可能希望尝试更大的值,例如范围1000,2000。
或者,您可以编写代码以将统一数量添加到模式类型“text”的所有y坐标。这是一种方式

for(i in seq(p$data)){ 
  if(!is.null(p$data[[i]]$mode)){                        ## if mode is not NULL
    if(p$data[[i]]$mode =="text"){                       ## above TRUE and if mode is "text"
      p$data[[i]]$y = p$data[[i]]$y + max(dat$Genes)/50  ## add max(dat$Genes)/50 or any addend you wish
    }
  }
}

这是情节: Plot from above