2013-04-21 12 views
15

Ich habe ein Beispiel, in dem ich einige Eigenschaften von Sequenzabgleichungen mit ggplot hervorheben möchte. Ich benutze geom_tile und möchte zwei Sätze unterschiedlich gefärbter Kacheln für zwei Score-Eigenschaften haben. Ich kann nur eins visualisieren.ggplot2 mehrere Skalen/Legenden pro Ästhetik, erneut besucht

Ich bin mir der Grenzen einer Skala pro Ästhetik bewusst (and the logic behind it), aber vielleicht hat jemand eine Idee, wie man es für Fälle wie diesen hackt, wo es sinnvoll wäre, verschiedene Farbskalen in einem "Plot" zu haben.

Vielleicht manuell die Grobs mit Zugabe, aber ich würde nicht wissen, wo ... beginnen

eine zusätzliche Frage: aus irgendeinem Grund die override.aes=list(shape = "A") funktioniert nicht, irgendwelche Ideen warum?

eine weitere: jede Methode, Text proportional zur Größe der Fliese (oder umgekehrt) zu skalieren?

library(ggplot2) 
library(grid) 

pd = data.frame(
    letters = strsplit("AGTGACCGACTATCATAGTGACCCAGAATCATAGTGACCGAGTATGAT", "")[[1]], 
    species = rep(c("Human", "Armadillo", "Porcupine"), each=16), 
    x  = rep(1:16, 3), 
    change = c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 
       0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0, 
       0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0), 
    score1 = c(0,0,0,0,0,0,1,1,2,2,2,3,3,3,4,3, 
       0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0, 
       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), 
    score2 = c(0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0, 
       0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0, 
       0,0,0,0,3,3,3,3,0,0,0,0,0,0,0,0) 
) 


ggplot(pd[pd$score1 != 0,], aes(x=x, y=species)) + 
    coord_fixed(ratio = 1.5, xlim=c(0.5,16.5), ylim=c(0.5, 3.5)) + 
    geom_tile(aes(fill=score1)) + 
    scale_fill_gradient2("Score 1", limits=c(0,4),low="#762A83", mid="white", high="#1B7837", guide=guide_colorbar(title.position="top")) + 
    geom_text(data=pd, aes(label=letters, color=factor(change)), size=rel(5), family="mono") + 
    scale_color_manual("Change", values=c("black", "#F2A11F"), labels=c("None", "Some"), guide=guide_legend(direction="vertical", title.position="top", override.aes=list(shape = "A"))) + 
    theme(panel.background=element_rect(fill="white", colour="white"), 
     axis.title = element_blank(), 
     axis.ticks.y = element_blank(), 
     axis.text.y = element_text(family="mono", size=rel(2)), 
     axis.text.x = element_text(size=rel(0.7)), 
     legend.text = element_text(size=rel(0.7)), 
     legend.key.size = unit(0.7, "lines"), 
     legend.position = "bottom", legend.box = "horizontal") + 
    ggtitle("What about Score2?") 

How to add another layer of tiles with different color scale?

Antwort

8

Es gelang mir, ein zufriedenstellendes Ergebnis zu erzielen, indem man grobs aus zwei getrennt erzeugten Plots kombinierte. Ich bin sicher, kann die Lösung besser verallgemeinert werden verschiedene Indizes grob ...

library(ggplot2) 
library(grid) 

pd = data.frame(
    letters = strsplit("AGTGACCGACTATCATAGTGACCCAGAATCATAGTGACCGAGTATGAT", "")[[1]], 
    species = rep(c("Human", "Armadillo", "Porcupine"), each=16), 
    x  = rep(1:16, 3), 
    change = c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 
       0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0, 
       0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0), 
    score1 = c(0,0,0,0,0,0,1,1,2,2,2,3,3,3,4,3, 
       0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0, 
       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), 
    score2 = c(0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0, 
       0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0, 
       0,0,0,0,3,3,3,3,0,0,0,0,0,0,0,0) 
) 


p1=ggplot(pd[pd$score1 != 0,], aes(x=x, y=species)) + 
    coord_fixed(ratio = 1.5, xlim=c(0.5,16.5), ylim=c(0.5, 3.5)) + 
    geom_tile(aes(fill=score1)) + 
    scale_fill_gradient2("Score 1", limits=c(0,4),low="#762A83", mid="white", high="#1B7837", guide=guide_colorbar(title.position="top")) + 
    geom_text(data=pd, aes(label=letters, color=factor(change)), size=rel(5), family="mono") + 
    scale_color_manual("Change", values=c("black", "#F2A11F"), labels=c("None", "Some"), guide=guide_legend(direction="vertical", title.position="top", override.aes=list(shape = "A"))) + 
    theme(panel.background=element_rect(fill="white", colour="white"), 
     axis.title = element_blank(), 
     axis.ticks.y = element_blank(), 
     axis.text.y = element_text(family="mono", size=rel(2)), 
     axis.text.x = element_text(size=rel(0.7)), 
     legend.text = element_text(size=rel(0.7)), 
     legend.key.size = unit(0.7, "lines"), 
     legend.position = "bottom", legend.box = "horizontal") + 
    ggtitle("Voila, the Score2!") 

p2=ggplot(pd[pd$score2 != 0,], aes(x=x, y=species)) + 
    coord_fixed(ratio = 1.5, xlim=c(0.5,16.5), ylim=c(0.5, 3.5)) + 
    geom_tile(aes(fill=score2)) + 
    scale_fill_gradient2("Score 2", limits=c(0,3),low="#1B7837", mid="white", high="#762A83", guide=guide_colorbar(title.position="top")) + 
    geom_text(data=pd, aes(label=letters, color=factor(change)), size=rel(5), family="mono") + 
    scale_color_manual("Change", values=c("black", "#F2A11F"), labels=c("None", "Some"), guide=guide_legend(direction="vertical", title.position="top", override.aes=list(shape = "A"))) + 
    theme(panel.background=element_rect(fill="white", colour="white"), 
     axis.title = element_blank(), 
     axis.ticks.y = element_blank(), 
     axis.text.y = element_text(family="mono", size=rel(2)), 
     axis.text.x = element_text(size=rel(0.7)), 
     legend.text = element_text(size=rel(0.7)), 
     legend.key.size = unit(0.7, "lines"), 
     legend.position = "bottom", legend.box = "horizontal") + 
    ggtitle("What about Score2?") 


p1g=ggplotGrob(p1) 
p2g=ggplotGrob(p2) 

combo.grob = p1g 

combo.grob$grobs[[8]] = cbind(p1g$grobs[[8]][,1:4], 
           p2g$grobs[[8]][,3:5], 
           size="first") 

combo.grob$grobs[[4]] = reorderGrob(
          addGrob(p1g$grobs[[4]], 
            getGrob(p2g$grobs[[4]], 
              "geom_rect.rect", 
              grep=TRUE)), 
          c(1,2,5,3,4)) 
grid.newpage() 
grid.draw(combo.grob) 

Two scales in one plot

4

I Größe von Text zur Anzeige der SCORE2 verwenden würde:

ggplot(pd[pd$score1 != 0,], aes(x=x, y=species)) + 
    coord_fixed(ratio = 1.5, xlim=c(0.5,16.5), ylim=c(0.5, 3.5)) + 
    geom_tile(aes(fill=score1)) + 
    scale_fill_gradient2("Score 1", limits=c(0,4),low="#762A83", mid="white", high="#1B7837", guide=guide_colorbar(title.position="top")) + 
    geom_text(data=pd, aes(label=letters, size = score2, color=factor(change)), family="mono") + 
    scale_size_continuous(range = c(4, 8)) + 
    scale_color_manual("Change", values=c("black", "#F2A11F"), labels=c("None", "Some"), guide=guide_legend(direction="vertical", title.position="top", override.aes=list(shape = "A"))) + 
    theme(panel.background=element_rect(fill="white", colour="white"), 
     axis.title = element_blank(), 
     axis.ticks.y = element_blank(), 
     axis.text.y = element_text(family="mono", size=rel(2)), 
     axis.text.x = element_text(size=rel(0.7)), 
     legend.text = element_text(size=rel(0.7)), 
     legend.key.size = unit(0.7, "lines"), 
     legend.position = "bottom", legend.box = "horizontal") + 
    ggtitle("What about Score2?") 

enter image description here

AKTUALISIERT:

Hier ist ein kurzer Hack, ich bin nicht sicher, ob dies visuell leicht zu überprüfen ist, obwohl ...

library(ggplot2) 
library(grid) 
library(proto) 

GeomTile2 <- proto(ggplot2:::GeomTile, { 
    reparameterise <- function(., df, params) { 
    df <- .$.super$reparameterise(df, params) 
    if (params$ud == "u") 
     transform(df, ymin = y) 
    else 
     transform(df, ymax = (y-ymin)*0.8 + ymin, ymin = (y-ymin)*0.2 + ymin) 
    } 
    draw <- function(..., ud) {.$.super$draw(..., ud)} 
}) 
geom_tile2 <- function (mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., ud = "u") { 
    GeomTile2$new(mapping = mapping, data = data, stat = stat, position = position, ..., ud = ud) 
} 

ggplot(pd, aes(x=x, y=species)) + 
    coord_fixed(ratio = 1.5, xlim=c(0.5,16.5), ylim=c(0.5, 3.5)) + 
    geom_tile2(aes(fill=score1), ud = "u") + 
    geom_tile2(aes(fill = score2), ud = "d") + 
    scale_fill_gradient2("Score 1", limits=c(0,4),low="#762A83", mid="white", high="#1B7837", guide=guide_colorbar(title.position="top")) + 
    geom_text(data=pd, aes(label=letters, color=factor(change)), size=rel(5), family="mono") + 
    scale_color_manual("Change", values=c("black", "#F2A11F"), labels=c("None", "Some"), guide=guide_legend(direction="vertical", title.position="top", override.aes=list(shape = "A"))) + 
    theme(panel.background=element_rect(fill="white", colour="white"), 
     axis.title = element_blank(), 
     axis.ticks.y = element_blank(), 
     axis.text.y = element_text(family="mono", size=rel(2)), 
     axis.text.x = element_text(size=rel(0.7)), 
     legend.text = element_text(size=rel(0.7)), 
     legend.key.size = unit(0.7, "lines"), 
     legend.position = "bottom", legend.box = "horizontal") + 
    ggtitle("What about Score2?") 

enter image description here

obere Hälfte zeigt SCORE1 während die untere für SCORE2.

+0

Dank aufnehmen koshke, ich habe in Betracht gezogen, aber es ist keine ausreichende visuelle Hinweis diese Eigenschaft darzustellen. Diese Alignments können eine Länge von hundert oder mehr Zeichen haben und können mehrere Dutzend Arten enthalten. Daher sind die Buchstaben relativ klein und es gibt oft keinen Platz, um ihre Größe zu verändern. Darüber hinaus ist manchmal das Ergebnis eine kontinuierliche Variable und es wird sehr schwierig sein, die relativen Mengen von einer Sequenz zur anderen zu erkennen. Ich fürchte, ich brauche etwas mehr "visual" – Krizbi

+0

Um nur ein reales Beispiel zu geben: [Hier ist eine vollständige Ausrichtung] (http://i.imgur.com/wB4prkv.png) – Krizbi

+0

@Krizbi Aktualisiert finden Sie bitte . – kohske

Verwandte Themen