2016-06-03 25 views
10

Sto cercando di impostare una scala personalizzata in R. I miei intervalli di dati in valori da -5,4 a +3,6 e voglio centrare i dati intorno a 0 (bianco). Vorrei una scala per i dati tale che ho lo stesso numero di gradazioni sopra e sotto 0 (sto girando per 7 al momento). Il problema che sto avendo è che non riesco a ottenere il ridimensionamento corretto e non sono sicuro di dove sia il mio problema.Impostazione scala colore personalizzata in R

Il mio codice al momento (dati di origine è in collegamento Pastebin in basso):

png('127-2_4_compare_other.png',width = 1200, height = 800, units = "px") 
    colfunc <- colorRampPalette(c("blue", "white", "red")) 
    f <- function(m) t(m)[,nrow(m):1] 
    colorBarz=matrix(seq(-5.5,4,len=15),nrow=1) 
    colorBarx=1 
    source("127-2_4.CompareMatrix.txt") 
    colorBary=seq(-5.4,3.6,len=15) 
    cus_breaks=c(-5.400, -4.725, -4.050, -3.375, -2.700, -2.025, -1.350, -0.675, 0.45, 0.90, 1.35, 1.80, 2.25, 2.70, 3.15, 3.60) 
    layout(matrix(c(1,2), 1, 2, byrow = TRUE), widths=c(9,1)) 
    image(f(Compare2and4),axes=FALSE,ylab="Amino acids",xlab="Position",main="Sample 2 vs. 4",col=colfunc(15),breaks=cus_breaks) 
    axis(1, seq(from = 0, to = 1, by = 0.03703), labels=c(1:11,1:17)) 
    axis(2, seq(from = 0, to = 1, by = 0.0526),labels=rev(c("A","R","N","D","C","E","Q","G","H","I","L","K","M","F","P","S","T","W","Y","V")),las=2) 
    image(colorBarx,colorBary,colorBarz,col=colfunc(15),axes=FALSE,xlab="",ylab="log(Sample4/Sample2)",breaks=cus_breaks) 
    axis(2,las=2) 
    dev.off() 

Cerco sette bidoni equamente diviso sopra 0 a 3.6 e sette cestini equamente diviso inferiori a 0 a -5,4 e vorrei che O colpisse nel mezzo del cestino bianco. Inoltre, se qualcuno può consultare il codice heatmap stesso per assicurarsi che non ci siano errori evidenti lo apprezzerei molto. Pastebin of the source data

Heatmap correct scale incorrect

+0

sicuro che risolvere il problema, ma in tal caso Tendo a scomporre i dati (ad esempio con 'cut') piuttosto che la tavolozza dei colori. –

+0

Se ho capito che il taglio è corretto, questo mi aiuterebbe a creare bin di dimensioni uguali sopra 0 e sotto 0. Penso di aver fatto lo stesso qui con cus_breaks anche se potrei non guardarlo correttamente? –

+0

probabilmente, questo può aiutare http://stackoverflow.com/questions/29301608/low-med-high-colors-for-deciles-in-ggplot – novice

risposta

1

Un problema con il vostro scala di colori proposto è che la distanza percettiva tra ciascun punto della scala non è uguale. La stessa distanza di colore si riferisce a un intervallo più ampio di valori di dati sul lato positivo, rispetto alla fine negativa. Suggerirei di non reinventare la ruota e di sfruttare le straordinarie capacità di ggplot.

Per impostazione predefinita, la scala di colore divergente avrà bianca come il punto medio al valore 0.

Ad esempio:

Compare2and4_t <- t(Compare2and4)[,nrow(Compare2and4):1] 
am_ac <- c("A","R","N","D","C","E","Q","G","H","I","L","K","M","F","P","S","T","W","Y","V") 
pdat <- data.frame(x = 1:nrow(Compare2and4_t), 
        y = factor(rep(am_ac, each = nrow(Compare2and4_t)), levels = rev(am_ac)), 
        val = c(Compare2and4_t)) 

library(ggplot2) 
library(scales) 

ggplot(pdat, aes(x, y, fill = val)) + 
    geom_tile() + 
    scale_fill_gradient2(low = 'darkblue', high = 'darkred', 
         limits = c(-5.4, 3.6), oob = squish) + 
    coord_equal(expand = FALSE) + 
    scale_x_continuous(breaks = unique(pdat$x)) + 
    theme_classic() + 
    labs(x = 'Position', y = 'Amino acids') 

enter image description here

non
Problemi correlati