【问题标题】:Manipulating the legend of scale_fill_gradient2操作 scale_fill_gradient2 的图例
【发布时间】:2017-10-11 22:47:32
【问题描述】:

我有来自统计测试的数据(基因集富集分析,但这并不重要),因此我获得了正态分布的统计数据的 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_tileggplot 中显示这些数据,以便我将df$category 的颜色编码为df$p.value 乘以df$stat.sign(即统计的符号)

为此,我首先使用df$p.valuelog10

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

然后我order df by 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())

这给了我:

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

【问题讨论】:

    标签: r ggplot2 gradient


    【解决方案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) + 
    

    【讨论】:

      【解决方案2】:

      我不确定我是否理解您要查找的内容。您的意思是您不想更改图例中的标签?如果您想更改由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 参数。

      【讨论】:

        猜你喜欢
        • 2015-12-29
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 2021-03-13
        • 2012-03-14
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多