2016-07-14 9 views
0

Ich habe einen Datenrahmen, in dem eine einzelne abhängige Variable (y) eine ~ log-lineare Beziehung mit der unabhängigen Variablen x1 und eine ~ sigmoidale Beziehung mit der unabhängigen Variablen x2 hat.Heatmap mit einer Logarithmusachse

df<-data.frame(x1 = rep(c(0:10),11), 
      x2 = rep(c(0:10), each=11), 
      logx1 = log(rep(c(0:10),11)+1), 
      y = 0) 

for(i in 1:nrow(df)) df[i,4] = exp(df[i,2]) * (1/(1+exp(-df[i,1]))) 

Ich möchte in Bezug auf Variation in x1 und x2 mit einer Heatmap in y Änderungen anzuzeigen:

ggplot(df, aes(x=x1, y=x2, fill=y))+ 
theme_bw()+ 
scale_fill_distiller(palette = "Spectral")+ 
geom_tile(size=0.01) 

aber es ist schwer zu sehen, die Änderung in y in Bezug auf x1, so dass ich wollen x1 auf einer logarithmischen Skala zeichnen:

ggplot(df, aes(x=logx1, y=x2, fill=y))+ 
theme_bw()+ 
scale_fill_distiller(palette = "Spectral")+ 
geom_tile(size=0.01)+ 

aber es führt zu großen Räume zwischen den Daten, wie auf eine kontinuierliche Oberfläche der Farbe gegen: gaps in heat map

Ich habe versucht:

x1 zu einem Faktor Umwandlung und Plotten:

df$x1<-factor(df$x1, levels = sort(unique(df$x1))) 

als Raster mit interpolieren Plotten:

geom_raster(interpolate = TRUE 

Umwandlung der Achse selbst:

scale_x_continuous(breaks = c(0,1,10)+1, limits = c(0,10)+1, trans = 'log') 

chan ging plot size mit coord_equal() und coord_fixed(),

die Auflösung der Daten erhöhen (d. h. schätzen Sie y für jede 0,001 Änderung in x1)

aber ich kann die Räume nicht weggehen!

Ich bin nicht unbedingt auf einer Heatmap verkauft, aber ich muß in Bezug sowohl auf x1 und x2 Variation in y angezeigt werden, und ich muß es ggplot in tun

Antwort

1

Wenn y ~ exp(x) wie in Ihrem Beispiel, dann Wenn Sie y (nicht x) auf einer logarithmischen Skala platzieren, ist dies möglicherweise eine bessere Möglichkeit, ihre Beziehung anzuzeigen. Z.B.

ggplot(df, aes(x=x1, y=x2, fill=log(y))) + 
    theme_bw() + 
    scale_fill_distiller(palette = "Spectral") + 
    geom_tile(size=0.01) 

heatmap 1 Alternativ Sie x auf einer exponentiellen Skala angezeigt werden kann (beachten Sie, dass in Ihrem Beispiel ist es eigentlich x2, die eine log-lineare Beziehung mit y und x1 sigmoidalen). Wenn Sie eine kontinuierliche Oberflächen-Heatmap mit x2 auf einer exponentiellen Skala anzeigen möchten, benötigen Sie Punkte für x2, die auf einer exponentiellen Skala gleichmäßig verteilt sind. Eine Möglichkeit, Punkte mit gleichem Abstand zu erhalten, ist die pretty()-Funktion. Z.B.

# generate new data with x2 equally space on exp scale 
newdat <- expand.grid(x1 = pretty(df$x1, 10), exp_x2 = pretty(exp(df$x2), 10)) 

# backtransform exp_x2 
newdat$x2 <- log(newdat$exp_x2) 

# generate y values (using raw x2 values, not exp_x2) 
newdat$y <- exp(newdat$x2) * (1/(1+exp(-newdat$x1))) 

# plot  
ggplot(newdat, aes(x=x1, y=exp_x2, fill=y)) + 
    theme_bw() + 
    scale_fill_distiller(palette = "Spectral") + 
    geom_tile(size=0.01) 

heatmap 2

+0

auf einem Protokoll Achse Plotten y würde für die eigentlichen Daten unangemessen ich habe, aber es ist sicherlich eine gute Lösung für dieses Beispiel (ein MWE). Ich habe am Ende etwas ähnliches zu Ihrem zweiten Posting verwendet und es funktioniert gut, danke! – cmhoove14