2017-10-11 321 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參數一些嘗試。