2017-10-11 322 views
1

我有来自统计测试(基因集丰富分析,但这不重要)的数据,所以我获得了正态分布和正态分布的统计量的p值:操纵scale_fill_gradient2的图例

该试验在几个类别运行:

set.seed(1) 
df <- data.frame(col = rep(1,7), 
       category = LETTERS[1:7], 
       stat.sign = sign(rnorm(7)), 
       p.value = runif(7, 0, 1), 
       stringsAsFactors = TRUE) 

我想在geom_tileggplot使得我颜色代码来呈现这些数据df$category通过df$p.value乘以它们df$stat.sign(即,的符号统计)

对于我第一次拿log10df$p.value的:

df$sig <- df$stat.sign*(-1*log10(df$p.value)) 

然后我orderdf通过df$sigdf$sig:

library(dplyr) 
df <- rbind(dplyr::filter(df, sig < 0)[order(dplyr::filter(df, sig < 0)$sig), ], 
      dplyr::filter(df, sig > 0)[order(dplyr::filter(df, sig > 0)$sig), ]) 

,然后将每个符号我ggplot它:

library(ggplot2) 
df$category <- factor(df$category, levels=df$category) 

ggplot(data = df, 
     aes(x = col, y = category)) + 
    geom_tile(aes(fill=sig)) + 
    scale_fill_gradient2(low='darkblue', mid='white', high='darkred') + 
    theme_minimal() + 
    xlab("") + ylab("") + labs(fill="-log10(P-Value)") + 
    theme(axis.text.y = element_text(size=12, face="bold"), 
     axis.text.x = element_blank()) 

这给了我:

enter image description here

有没有一种方法来操纵legend使得df$sig值由它们的绝对值来表示,但一切保持不变?这样我仍然可以获得红色和蓝色色调并保持我想要的顺序。

回答

1

如果您检查ggplot的文档,scale_fill_gradient2,像其他的连续尺度,接受其labels参数执行下列操作之一:

  • NULL对没有标签
  • waiver()对于计算为transofrmation对象的默认标签
  • 给出标签的字符向量(必须与breaks相同长度)
  • 一个函数需要br eaks作为输入并返回标签作为输出

由于您只想传说值是绝对的,我假设你满意的传奇色彩条(-0.1默认的休息,以0.4与0.1的增量),所以你真正需要的是添加一个操纵标签的函数。

I.e.而不是这样的:

scale_fill_gradient2(low = 'darkblue', mid = 'white', high = 'darkred') + 

使用此:

scale_fill_gradient2(low = 'darkblue', mid = 'white', high = 'darkred', 
        labels = abs) + 

plot

1

我不确定我是否明白你在找什么。你的意思是说你不想在传说中改变标签?如果您想要更改由scale_fill_gradient2()给出的操作breakslabels的标签,则应执行此操作。

ggplot(data=df,aes(x=col,y=category)) + 
    geom_tile(aes(fill=sig)) + 
    scale_fill_gradient2(low='darkblue',mid='white',high='darkred', 
         breaks = order(unique(df$sig)), 
         labels = abs(order(unique(df$sig)))) + 
    theme_minimal()+xlab("")+ylab("")+labs(fill="-log10(P-Value)") + 
    theme(axis.text.y=element_text(size=12,face="bold"),axis.text.x=element_blank()) 

对于你在找什么,也许你可以在里面数字显示文本显示的值,尝试堆叠stat_bin_2d()这样的:

ggplot(data=df,aes(x=col,y=category)) + 
     geom_tile(aes(fill=sig)) + 
     scale_fill_gradient2(low='darkblue',mid='white',high='darkred', 
          breaks = order(unique(df$sig)), 
          labels = abs(order(unique(df$sig)))) + 
     theme_minimal()+xlab("")+ylab("")+labs(fill="-log10(P-Value)") + 
     stat_bin_2d(geom = 'text', aes(label = sig), colour = 'black', size = 16) + 
     theme(axis.text.y=element_text(size=12,face="bold"),axis.text.x=element_blank()) 

你可能想给sizecolour参数一些尝试。