2017-10-11 11 views
1

J'ai des données qui proviennent d'un test statistique (analyse d'enrichissement d'ensemble de gènes, mais pas important), donc j'obtiens des p-values ​​pour des statistiques normalement distribuées, c'est à dire des valeurs positives et négatives:Manipuler la légende de scale_fill_gradient2

le test est exécuté sur plusieurs catégories:

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) 

Je veux présenter ces données dans un geom_tileggplot tel que le code I couleur du df$category par leur df$p.value multiplié par leur df$stat.sign (soit le signe de la statistique)

Pour que je prends d'abord la log10 de df$p.value:

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

Je order le df par df$sig pour chaque signe de 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), ]) 

Et puis je ggplot il:

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()) 

qui me donne:

enter image description here

est-il un moyen de manipuler la legend telle que les valeurs de df$sig sont représentés par leur valeur absolue, mais tout reste inchangé le reste? De cette façon, je reçois toujours les deux tons rouges et bleus et maintenez l'ordre que je veux.

Répondre

1

Si vous consultez la documentation de ggplot, scale_fill_gradient2, comme d'autres échelles continues, accepte une des options suivantes pour son argument labels:

  • NULL pour aucune étiquette
  • waiver() pour les étiquettes par défaut calculées pour l'objet transofrmation
  • un vecteur de caractères donnant les étiquettes (doivent être de même longueur que breaks)
  • une fonction qui prend la br Eaks en entrée et retourne les étiquettes en sortie

Puisque vous voulez que les je suppose que vous êtes des valeurs de légende pour être absolue, satisfait des pauses par défaut dans la barre de couleur de légende (-0,1 à 0,4 avec des incréments de 0,1), tout ce dont vous avez vraiment besoin est d'ajouter une fonction qui manipule les étiquettes.

I.e. au lieu de cela:

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

Utilisez ceci:

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

plot

1

Je ne suis pas sûr d'avoir compris ce que vous cherchez. Voulez-vous dire que vous ne voulez pas changer les étiquettes dans les légendes? Si vous voulez changer les étiquettes manipulant breaks et labels donné par scale_fill_gradient2() doit le faire.

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()) 

Pour ce que vous cherchez, vous pourriez peut-être afficher des textes dans la figure pour montrer les valeurs, essayez d'empilement stat_bin_2d() comme ceci:

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()) 

Vous pourriez vouloir donner les arguments size et colour quelques essais.