2016-06-03 63 views
10

Próbuję ustawić niestandardową skalę w R. Moje zakresy danych w wartościach od -5,4 do +3,6 i chcę wyśrodkować dane około 0 (białe). Chciałbym uzyskać dane w takiej skali, że mam taką samą liczbę gradacji powyżej i poniżej 0 (strzelam obecnie 7 razy). Problem, który mam, polega na tym, że nie mogę uzyskać poprawności skali i nie jestem pewien, gdzie jest mój problem.Konfigurowanie niestandardowej skali kolorów w R

Mój kod w tej chwili (dane źródło jest w Pastebin linku na dole):

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

szukam siedmiu równo podzielonych pojemników powyżej 0 do 3,6 i siedem równo podzielonych pojemników poniżej 0 do -5,4 i chciałbym, żeby 0 trafiło w środek białego kosza. Także jeśli ktoś może przejrzeć kod samej mapy termicznej, aby upewnić się, że nie ma oczywistych błędów, byłbym bardzo wdzięczny. Pastebin of the source data

Heatmap correct scale incorrect

+0

na pewno będzie to naprawić problem, ale w takim przypadku Mam tendencję do binowania danych (np. Z 'cut') zamiast palety kolorów. –

+0

Jeśli rozumiem, że cięcie jest poprawne, to pomogłoby mi ustawić tak duże rozmiary beli powyżej 0 i poniżej 0. Myślę, że zrobiłem to samo z cus_breaks, chociaż nie mogłem na nie patrzeć poprawnie? –

+0

Prawdopodobnie może to pomóc http://stackoverflow.com/questions/29301608/low-med-high-colors-for-deciles-in-ggplot – novice

Odpowiedz

1

Problem z proponowanej skali kolorów jest to, że percepcyjne odległość między każdym punktem na skali nie jest równa. Ta sama odległość koloru odnosi się do większego zakresu wartości danych na dodatnim końcu, w porównaniu do ujemnego końca. Sugerowałbym, aby nie wymyślać koła na nowo i nie używać wielkich możliwości ggplot.

Domyślnie rozbieżne skala kolor będzie miał białe jak środkowego na wartość 0.

Na przykład:

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

nie