如何使用tidy data.frame提供的值使用ggplot :: annotate()添加文本

时间:2017-05-11 13:46:55

标签: r ggplot2

使用以下数据框:


df <- structure(list(some_score = c(0.159908755191963, 0.191316882518594, 0.505115802144402, 
  0.137543374720433, 0.00611518542460786, 0.17817657028984, 0.184484678282946, 
  0.389765901467282, 0.240839237211809, 0.00673361274812246), crt = c(0.137543374720433, 
  0.137543374720433, 0.137543374720433, 0.137543374720433, 0.137543374720433, 
  0.17817657028984, 0.17817657028984, 0.17817657028984, 0.17817657028984, 
  0.17817657028984), sr = c(0.374378046673855, 0.374378046673855, 0.374378046673855, 
  0.374378046673855, 0.374378046673855, 0.115542340010558, 0.115542340010558, 
  0.115542340010558, 0.115542340010558, 0.115542340010558), sample = structure(c(1L, 
  1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), .Label = c("Sample1", "Sample2"), class = "factor"), 
  celltype = c("B", "Mac", "NK", "Neu", "Stro", "B", "Mac", "NK", "Neu", "Stro")), 
  .Names = c("some_score", "crt", "sr", "sample", "celltype"), row.names = c(NA, 
    10L), class = "data.frame")
df
#>     some_score       crt        sr  sample celltype
#> 1  0.159908755 0.1375434 0.3743780 Sample1        B
#> 2  0.191316883 0.1375434 0.3743780 Sample1      Mac
#> 3  0.505115802 0.1375434 0.3743780 Sample1       NK
#> 4  0.137543375 0.1375434 0.3743780 Sample1      Neu
#> 5  0.006115185 0.1375434 0.3743780 Sample1     Stro
#> 6  0.178176570 0.1781766 0.1155423 Sample2        B
#> 7  0.184484678 0.1781766 0.1155423 Sample2      Mac
#> 8  0.389765901 0.1781766 0.1155423 Sample2       NK
#> 9  0.240839237 0.1781766 0.1155423 Sample2      Neu
#> 10 0.006733613 0.1781766 0.1155423 Sample2     Stro

这段代码:

# function to round the values. As they are characters you have to use a string manipulation
round_string <- function(string) substr(string, 1, 5)

tableau10 <- c("#17BECF", "#BCBD22", "#7F7F7F", "#CFECF9", "#8C564B", "#9467BD", "#D62728", "#2CA02C", "#FF7F0E", "#1F77B4" )

# the plot
ggplot(df, aes(x=celltype,y=some_score, fill=celltype)) + 
  geom_bar(stat="identity") + 
  scale_fill_manual(values=tableau10) + 
  geom_hline(aes(yintercept=crt), colour="red", linetype="dashed") +
  theme_minimal(base_size=20) +
  theme(strip.background=element_blank(),strip.text = element_text(size=10)) +
  theme(legend.title=element_blank()) +
  theme(axis.text.y=element_text( hjust=1,size=10)) +
  facet_wrap(~sample + crt + sr,labeller = labeller(crt=as_labeller(round_string, default = label_both),
                                                    sr=as_labeller(round_string, default = label_both), 
                                                    .multi_line = F))

我可以创建这个情节:enter image description here

如该图中所述,我如何使用crtsrggplot::annotate()值放置在图中?还是有其他更好的方法吗?

1 个答案:

答案 0 :(得分:0)

crt.strs <- format(round(tapply(df$crt,df$sample,unique),3),nsmall=3)
sr.strs <- format(round(tapply(df$sr,df$sample,unique),3),nsmall=3)

ggplot(df, aes(x=celltype,y=some_score, fill=celltype)) + 
      geom_bar(stat="identity") + 
      scale_fill_manual(values=tableau10) + 
      geom_hline(aes(yintercept=crt), colour="red", linetype="dashed") +
      theme_minimal(base_size=20) +
      theme(strip.background=element_blank(),strip.text = element_text(size=10)) +
      theme(legend.title=element_blank()) +
      theme(axis.text.y=element_text( hjust=1,size=10)) +
      facet_wrap(~sample + crt + sr,labeller = labeller(crt=as_labeller(round_string, default = label_both),
                                                        sr=as_labeller(round_string, default = label_both), 
                                                        .multi_line = F)) +
      annotate(geom="text", x=1.5, y=0.45, col="red", 
           label=paste("atop(' crt: '*",crt.strs,",' srt: '*",sr.strs,")"), parse=T)

enter image description here