2013-12-10 8 views
6

Ich bin dieses Problem noch einmal in Zusammenhang trat ich vor etwa einem Jahr. Ich möchte, dass mein "Colourbar" -Führer effektiv auf einer logarithmischen Skala angezeigt wird, so dass der Take-away bei der Betrachtung darin besteht, dass zunehmend dunklere Blauwerte eine größere Bedeutung haben.Ändern der Größe/manuell geben Brüche auf Farbbalken-Guide von geom_tile und ersetzt Y-Achsen-Labels

Mit dem folgenden Code generieren ich das Bild unten:

pz <- ggplot(dat.m, aes(x=variable,y=Category)) + 
    geom_tile(aes(fill=value)) + 
    xlab(NULL) + ylab(NULL) + 
    scale_fill_gradientn(colours=c("#000066","#0000FF","#DDDDDD","white"), 
        values=c(0,0.05,0.050000000000001,1.0), 
        breaks=c(0, 0.000001, 0.01, 0.05, 1), 
        guide = "colourbar") + 
    theme_bw()+ 
    theme(panel.background = element_blank(), 
     panel.border = element_blank(), 
     axis.ticks.x = element_blank(), 
     axis.ticks.y = element_blank()) + 
    theme(legend.position="top", 
     legend.text = element_text(angle=45), 
     axis.text.x = element_text(angle=45) 
) 

colourbar

Oder ich es als eine "Legende" angezeigt werden kann im Gegensatz zu einem "colourbar":

enter image description here

Aber was ich wirklich wünsche, ist etwas wie dieses:

enter image description here

Ich habe versucht, 'trans = "log"' (scale_fill_gradientn (trans = "log")) hinzufügen, aber es gibt viele Nullen in meine Daten, die ein Problem verursacht. Wenn Sie irgendwelche Ideen haben, würde es sehr geschätzt werden!


Zurück Wortlaut:

Ich versuche, eine Heatmap von p-Werte für verschiedene Proben für verschiedene Kategorisierungen zu machen. Es gibt zwei Dinge, die ich auf diesem Grundstück ändern möchte:

  1. Ich mag die Legende von meinem geom_tile Grundstück anzupassen das untere Ende der Legende Skala zu betonen, während immer noch das volle Spektrum der Gradienten aufrechterhalten - ähnlich wie es aussehen würde, wenn es eine logarithmische Skala wäre. So wird im Wesentlichen der Weiß-zu-Blau-Übergang von 1,0-0,05 und der Blau- zu Dunkelblau-Übergang von 0,05-0,00 in etwa gleich groß sein. Gibt es eine Möglichkeit, den Farbbalken manuell anzupassen?

  2. Ich möchte die Y-Achsennamen ersetzen, so dass ich meine "leere" Zeilenbezeichnung entfernen kann. Beachten Sie, dass die Kategorien hier einfach als Buchstaben dargestellt werden, aber in meinem realen Datensatz sind sie lange Namen. Ich habe "Dummy" -Zeilen von Daten eingefügt, um Kategorisierungen in Chucks zu teilen und die Kacheln in jedem Block so angeordnet, dass sie von höchst signifikant zu nicht signifikant gehen - ich bin mir sicher, dass es eine bessere Lösung dafür gibt viele gescheiterte Versuche anderer Ideen fand ich auf Stack-Überlauf! Ich habe versucht, sie mit scale_y_discrete zu beschriften, aber das wird mit der oben genannten Bestellung durcheinander gebracht.

Hilfe mit einem dieser Probleme wird sehr geschätzt werden!Hier

sample_heatmap

ist ein Beispieldatensatz:

dput(dat.m) 
structure(list(Category = structure(c(12L, 11L, 10L, 9L, 8L, 
7L, 6L, 5L, 4L, 3L, 2L, 1L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 
4L, 3L, 2L, 1L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 
1L), class = "factor", .Label = c("j", "i", "empty2", "h", "empty1", 
"g", "f", "e", "d", "c", "b", "a")), variable = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L), .Label = c("b2", "c1", "c2"), class = "factor"), 
    value = c(7.40214650772221e-06, 0.0075828339, 0.1825924627, 
    0.0384381317, 0.0440256659, 0.3659284985, 0.9777569144, 1, 
    0.0075828339, 1, 0.2193606406, 0.3659284985, 0.0004289756, 
    0.0011541045, 0.0004289756, 0.4400885491, 0.6121402215, 0.6724032426, 
    0.2735924085, 1, 0.018824582, 1, 0.4386503891, 0.4249526456, 
    1.05094571578633e-05, 0.0027216795, 0.715979827, 0.0050376405, 
    0.7473334763, 0.9053300832, 1, 1, 0.0015392848, 1, 0.039679469, 
    0.0950327519)), .Names = c("Category", "variable", "value" 
), row.names = c(NA, -36L), class = "data.frame") 

Und hier ist mein Code:

col_blue <- c("#FFFFFF","#000099","#000066","#000033") 
ggplot(dat.m, aes(x=variable,y=Category)) + 
    geom_tile(aes(fill=value)) + 
    xlab(NULL) + ylab(NULL) + 
    scale_fill_gradientn(colours=col_blue, values=c(1,0.05,0.01,0),guide="colorbar") + 
    theme_mary(base_size=12) 

UPDATE:

So, jetzt habe ich geändert t Er codiert als solcher mit den folgenden Ergebnissen. Ich komme näher an das, was ich erreichen möchte, aber ich würde gerne mit den Proportionen der Farbleiste spielen, um den Farbverlauf von 0,05-0,0 etwas deutlicher zu zeigen.

col_blue <- c("#FFFFFF","#000099","#000066","#000033") 
ggplot(dat.m, aes(x=variable,y=Category)) + 
    geom_tile(aes(fill=value)) + 
    xlab(NULL) + ylab(NULL) + 
    scale_fill_gradientn(colours=col_blue, values=c(1,0.05,0.01,0), guide=FALSE) + 
    scale_colour_gradientn(guide = "colourbar", limits = c(0,1),breaks=c(1,0.05,0.01,0),values=c(1,0.05,0.01,0),colours=c("#FFFFFF","#000099","#000066","#000033")) 

image2

+1

Woher kam 'theme_mary'? –

+0

Ich weiß, das ist ein alter Kommentar, aber da ich gerade die Frage hier aktualisiert habe, ist die Antwort - theme_mary war ein benutzerdefiniertes Thema, das ich zuvor gemacht hatte. Ich habe es aus dem aktualisierten Code entfernt. Entschuldigung für jede Verwirrung! – ONeillMB1

Antwort

0

für (1), ändern einfach die Daten, bevor Sie die leeren Zeilen fallen verwendet wird (oder wie Sie) aufgetragen ist. zB: ggplot(dat.m[!grepl("^empty", dat.m$Category), ], aes(<etc>...))

für können Sie die Ästhetik speziell für die Legende übersteuern. Hier ist ein Beispiel, stellen Sie nach Ihrem Geschmack: + guides(fill=guide_legend(override.aes=list(alpha=1)))

enter image description here

+0

Hallo Ricardo, danke für deine Eingabe. Ich denke, ich war über das Problem Nr. 2 unklar. Ich möchte eigentlich die leere Zeile dort (es ist Kategorisierungsschemata in meinen echten Daten zu brechen), ich möchte nur das Etikett entfernen. Wie bei # 1 möchte ich die kontinuierliche Farbskala beibehalten. Allerdings hätte ich gerne den Guide/die Legende, der den Gradient von 0-0.05 zeigt, und von 0,05-0 in ungefähr gleichen Längen. – ONeillMB1

+0

Ich habe das Problem # 1 in meinem Beitrag umformuliert, um es klarer zu machen. – ONeillMB1

+0

@ user2145578, dann ändern Sie einfach die Ebenen. 'levels (data) <- list (empty01 =" ", empty02 =" ")' –

2

Wir scale_fill_gradientn kann nicht sagen, einen Leitfaden zum Anzeigen mit guide=FALSE, dann manuell eigenen hinzufügen mit Grenzen gesetzt c(0,0.1) (oder was auch immer Bereich Sie möchten).

ggplot(dat.m, aes(x=variable,y=Category)) + 
    geom_tile(aes(fill=value)) + 
    xlab(NULL) + 
    ylab(NULL) + 
    scale_fill_gradientn(colours=col_blue, values=c(1,0.05,0.01,0), guide=FALSE) + 
    scale_colour_gradientn(guide = "colorbar", limits = c(0,0.1), colours=col_blue) 

enter image description here

Was Ihren zweiten Punkt, warum entfernt nicht nur die „leeren“ Zeilen aus den Quelldaten vor dem Plotten?

+0

Danke, das ist nützlich, aber nicht ganz das, wonach ich strebe. Die Skala ist eigentlich die Umkehrung dessen, was die Farben anzeigen, was ich leicht durch Umkehrung der Reihenfolge der Farbskalen beheben kann. Allerdings möchte ich immer noch die gesamte Skala zeigen, nur nicht linear beabstandet - macht das Sinn? Zum Beispiel würde ich gerne von 0-0.05 und von 0.05-0.00 in ungefähr gleichen Anteilen auf der Führung/Legende zeigen. Was die leeren Zeilen angeht, möchte ich ein Leerzeichen in der Zeichnung, und deshalb habe ich die leeren Zeilen hinzugefügt. Mein tatsächlicher Datensatz hat mehrere Kategorien von Kategorien und ich möchte einen Platz. – ONeillMB1

+0

Ich habe das Problem # 1 oben umformuliert, um das, was ich versuche, klarer zu machen. – ONeillMB1

Verwandte Themen