2012-04-13 5 views
5

Ich bin sehr neu zu R so bitte bitte mit mir, wenn etwas nicht klar ist in meiner Frage.Mit mehreren scale_colour_gradient Skalen für verschiedene Bereiche der Daten in einem Plot

Ich habe eine data.frame "Protein" mit 5 Spalten, nämlich;

1. Proteinname, 2. Protein_FC, 3. Protein_pval, 4.mRNA_FC, 5.mRNA_pval und 6.freq.

Ich versuche, ein Vulkan-Diagramm mit x = log2 (Protein_FC), y = -log10 (protein_pval) zu plotten. Dann kartieren Sie die Größe der Punkte auf Freq und Farbe auf mRNA_FC. Das alles funktioniert gut und hier ist der Code, den ich verwendet habe:

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

alles ist in Ordnung, bis hier. Aber wegen der Art des Experiments, Daten ist es ziemlich dicht um mRNA_FC = 0. Dort funktioniert das Standardfarbschema, das ggplot anwendet, nicht sehr gut, um verschiedene Punkte zu unterscheiden.

Ich habe verschiedene Farbskalen mit low="colour1" und high="colour2" ausprobiert. Ich denke jedoch, dass es am besten ist, mehrere Farbskalen über die Bereiche mRNA_FC zu verwenden, d.h. blau zu weiß für -3<mRNA<-0.2, rot zu weiß für -0.2<mRNA_FC<0, grün zu weiß für 0<mRNA_FC<0.2 und schwarz zu weiß für 0.2<mRNA_FC<3.

Aber ich habe noch keinen Weg gefunden, es zu tun.

Jede Hilfe wäre willkommen. Prost!

+0

Ich verstehe nicht ganz Ihre Frage. Eine Beispielfigur oder ein Datensatz wäre schön, um besser zu verstehen, was mit den Standard-Farbpaletten von ggplot2 nicht stimmt. – smu

+0

Die Standard-Farbskala rundet die Daten um mRNA_FC = 0 ab, aber ich möchte, dass sie auf beiden Seiten von 0 eine völlig andere Farbe zeigt. Ich denke, dass ihre Anzeige sehr nahe bei 0 liegt, sagen wir -0,1, 0 und 0,1 gleiche Farbe. Leider kann ich den Datensatz nicht freigeben, da er bald veröffentlicht werden muss und der Eigentümer der Daten dies noch nicht veröffentlichen möchte. – ktyagi

+0

Was ist dann mit einer diskreten Farbskala mit benutzerdefinierten "Brüchen"? – smu

Antwort

10

Für diese Art von Sache, die Sie verwenden möchten scale_gradientn. Zum Beispiel:

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

Danke John. Genau das wollte ich. Um ehrlich zu sein, dauerte es eine Weile, bis ich herausgefunden habe, wie ich es am besten nutzen kann, wie ich in der Post gesagt habe, meine Erfahrung in R ist 2 Wochen alt. – ktyagi

Verwandte Themen