操纵scale_fill_gradient2

时间:2017-10-11 22:47:33

标签: r ggplot2 gradient

我有来自统计检验的数据(基因集富集分析,但这并不重要),因此我获得了正态分布的统计数据的p值,即正值和负值:< / p>

测试分为几个类别:

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_tile ggplot中展示这些数据,以便df$categorydf$p.value乘以df$stat.sign(即,统计的标志)

为此我首先采用log10的{​​{1}}:

df$p.value

然后df$sig <- df$stat.sign*(-1*log10(df$p.value)) order df df$sig df$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的值由其绝对值表示,但其他一切保持不变?这样我仍然可以获得红色和蓝色阴影并保持我想要的顺序。

2 个答案:

答案 0 :(得分:1)

我不确定我是否明白了你在寻找什么。你的意思是你不想改变传说中的标签吗?如果您想更改操纵breakslabels scale_fill_gradient2()的标签,请执行此操作。

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个参数。

答案 1 :(得分:1)

如果您查看ggplot的文档,scale_fill_gradient2与其他连续比例一样,请为其labels参数接受以下其中一项:

  • NULL没有标签
  • waiver()表示为转型对象计算的默认标签
  • 给出标签的字符向量(必须与breaks的长度相同)
  • 将中断作为输入并将标签作为输出返回的函数

由于您只希望图例值是绝对的,我假设您对图例颜色栏中的默认中断(-0.1到0.4,增量为0.1)感到满意,所以您真正需要的是添加一个操纵标签的功能。

即。而不是这个:

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

使用此:

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

plot