2012-04-13 8 views
5

Sono molto nuovo a R quindi, per favore, sopportami se qualcosa non è chiaro nella mia domanda.Utilizzo di più scale scale_colour_gradient per diversi intervalli di dati in un grafico

Ho una "proteina" data.frame con 5 colonne, vale a dire;

1.protein_name, 2.protein_FC, 3.protein_pval, 4.mRNA_FC, 5.mRNA_pval e 6.freq.

Sto provando a tracciare un grafico di vulcano con x = log2 (protein_FC), y = -log10 (protein_pval). Quindi mappare la dimensione dei punti su freq e colore su mRNA_FC. Tutto funziona perfettamente ed ecco il codice che ho usato:

ggplot(protein [ which (protein$freq <= 0.05),] , aes(x = log2(protein_FC) , 
     y = -log10 (protein_pval) , size = freq , colour = mRNA_FC , 
     label = paste(protein_name,",",mRNA_pval), alpha=1/1000)) + 
    geom_point() + geom_text(hjust = 0 , vjust = 0 , colour = "black" , size = 2.5) + 
    geom_abline(intercept = 1.3 , slope = 0) + 
    scale_colour_gradient(limits=c(-3,3)) 

tutto va bene fino a qui. Ma a causa della natura dell'esperimento, i dati sono piuttosto densi intorno a mRNA_FC = 0. Lì, lo schema di colori di default che applica ggplot non funziona molto bene nel distinguere diversi punti.

Ho provato varie scale di colori utilizzando low="colour1" e high="colour2". Tuttavia, ritengo sia preferibile utilizzare più scale di colori nell'intervallo mRNA_FC, ad esempio qualcosa di simile. da blu a bianco per -3<mRNA<-0.2, rosso a bianco per -0.2<mRNA_FC<0, verde a bianco per 0<mRNA_FC<0.2 e nero a bianco per 0.2<mRNA_FC<3.

Ma non ho ancora trovato il modo di farlo.

Qualsiasi aiuto sarebbe apprezzato. Cheers!

+0

Non capisco pienamente alla tua domanda. Un esempio di figura o set di dati sarebbe bello, per capire meglio cosa c'è di sbagliato con i colori di default ggplot2. – smu

+0

I round di scala dei colori predefiniti dei dati attorno a mRNA_FC = 0, ma voglio che mostri colori completamente diversi sui due lati di 0. Sento che i suoi punti di visualizzazione sono molto vicini a 0, ad esempio -0.1, 0 e 0.1 con stesso colore Spiacente, non posso condividere il set di dati perché è presto disponibile per la pubblicazione e il proprietario dei dati non vuole renderlo pubblico ancora. – ktyagi

+0

Allora, che ne è di una scala di colori discreta con "interruzioni" definite dall'utente? – smu

risposta

10

Per questo tipo di cose si desidera utilizzare scale_gradientn. Per esempio:

library(ggplot2) 

x = seq(-0.1, 0.1, len=100) 
y = 0:10 
dat = expand.grid(x=x, y=y) 

ggplot(data=dat, aes(x=x, y=y, fill=x)) + 
    geom_raster() + 
    scale_fill_gradientn(colours=c('red', 'yellow', 'cyan', 'blue'), 
    values = c(-0.05,-1e-32,1e-32,0.05), 
    breaks = c(-0.05,-0.005,0.005,0.05), 
    rescaler = function(x,...) x, 
    oob  = identity) 

enter image description here

+0

Grazie John. Questo è esattamente quello che volevo. Ad essere sinceri mi ci è voluto un po 'per capire il modo migliore di usarlo, come ho detto nel post la mia esperienza in R è di 2 settimane. – ktyagi

Problemi correlati