Diagonale Etikettenausrichtung auf der x-Achse in Heatmap (s)
Erstellen von heatmaps in R hat ein Thema viele Beiträge, Diskussionen und Iterationen. Mein Hauptproblem ist, dass es schwierig zu kombinieren visuelle Flexibilität von Lösungen im Gitter levelplot()
oder einfache Grafiken image()
, mit müheloser clustering von basic heatmap()
, pheatmap ist pheatmap()
oder gplots' heatmap.2()
. Es ist ein winziges detail, das ich ändern wollen - Diagonale Ausrichtung der Etiketten auf der x-Achse. Lassen Sie mich Ihnen zeigen, dass mein Punkt im code.
#example data
d <- matrix(rnorm(25), 5, 5)
colnames(d) = paste("bip", 1:5, sep = "")
rownames(d) = paste("blob", 1:5, sep = "")
Können Sie ändern Sie die Ausrichtung in der Diagonale leicht mit levelplot()
:
require(lattice)
levelplot(d, scale=list(x=list(rot=45)))
aber unter Anwendung des clustering scheint Schmerzen. So auch mit anderen visuellen Optionen wie das hinzufügen von Rahmen um heatmap-Zellen.
Nun, die Verlagerung der tatsächlichen heatmap()
Verwandte Funktionen, clustering und alle grundlegenden visuals sind super-einfach - fast kein Abgleich erforderlich:
heatmap(d)
und so ist hier:
require(gplots)
heatmap.2(d, key=F)
und schließlich, mein Favorit:
require(pheatmap)
pheatmap(d)
Aber alle diese haben keine option zum drehen der Beschriftungen. Handbuch für pheatmap
deutet darauf hin, dass ich verwenden können grid.text
zu custom-orient-Etiketten. Was für eine Freude es ist - vor allem, wenn clustering und ändern die Reihenfolge der angezeigten labels. Es sei denn, ich bin hier etwas fehlt...
Schließlich, es ist ein guter Alter image()
. Ich kann es drehen Etiketten, im Allgemeinen ist es der am meisten anpassbare Lösung, aber keine Cluster-option.
image(1:nrow(d),1:ncol(d), d, axes=F, ylab="", xlab="")
text(1:ncol(d), 0, srt = 45, labels = rownames(d), xpd = TRUE)
axis(1, label=F)
axis(2, 1:nrow(d), colnames(d), las=1)
Also, was soll ich tun, um meine ideale, schnelle heatmap, Cluster und Orientierung und visueller Funktionen hacking? Mein bestes Gebot ändern heatmap()
oder pheatmap()
irgendwie, weil diese zwei scheinen besonders vielseitig in der Einstellung. Aber alle Lösungen willkommen.
text
"hack", dass Sie zeigen, in den letzten image
- Beispiel. Ich würde wohl passieren xaxt = FALSE
zu heatmap
- Anruf und fügen Sie dann die Achse ohne Beschriftungen, und fügen Sie dann die Etiketten mit text
, wie bei image
. heatmap()
ist bauen mit base Grafik dann lieber grid (ich dachte, es war raster wie pheatmap()
). InformationsquelleAutor der Frage Geek On Acid | 2013-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fix
pheatmap
alle, die Sie wirklich tun möchten, ist zu gehen inpheatmap:::draw_colnames
und zwicken ein paar Einstellungen, die in dem Aufrufgrid.text()
. Hier ist ein Weg, das zu tun, mitassignInNamespace()
. (Sie müssen möglicherweise weitere Anpassungen, aber Sie erhalten das Bild ;):InformationsquelleAutor der Antwort Josh O'Brien
Es ist ein wenig komplexer, als mein Kommentar vermutet, weil
heatmap
bricht der Plot-region, um die zum zeichnen des dendrogramms und der Letzte plot-region ist nicht dieimage
Handlung, die Sie möchten, befestigen Sie die Etiketten.Gibt es eine Lösung, wenn, wie
heatmap
bietet dieadd.expr
argument, das dauert ein Ausdruck sein, der ausgewertet wird, wenn dieimage
gezogen wird. Man muss auch wissen, die Neuordnung des labels erfolgt aufgrund der das dendrogramm der Bestellung. Das Letzte Stück beinhaltet eine etwas unelegant hack wie ich ziehen die heatmap an, um die Neuordnung von Informationen und dann verwenden, um schöpfen die heatmap korrekt mit dem abgewinkelten labels.Zunächst ein Beispiel aus
?heatmap
In diesem Stadium werden die Etiketten nicht, wie wir Sie wollen, aber
hv
enthält die Informationen, die wir brauchen, um die Reihenfolge dercolnames
vonmtcars
in Ihrer Komponente$colInd
:Verwenden Sie diese, wie würden Sie die Ausgabe von
order
z.B.:Nun verwenden, um zu generieren, die Etiketten, die wir wollen in der richtigen Reihenfolge:
Dann haben wir re-call
heatmap
aber diese Zeit geben wirlabCol = ""
zu unterdrücken, die Kennzeichnung der Spalte Variablen (mit null-Länge-Zeichenfolgen). Wir verwenden auch einen Aufruftext
zeichnen Sie die Markierungen an den gewünschten Winkel. Der Aufruftext
ist:ist im wesentlichen, was Sie haben in Ihre Frage. Spielen Sie mit dem Wert der
y
so müssen Sie diese anpassen, um die Länge des strings, so haben die labels nicht überlappen mit derimage
Grundstück. Wir gebenlabels = labs
übergeben die Etiketten, die wir wollen, zeichnen in der vorgeschriebenen Reihenfolge. Die gesamtetext
Anruf übergebenadd.expr
ohne Anführungszeichen. Hier ist der gesamte Aufruf:Sind die Ergebnisse in:
InformationsquelleAutor der Antwort Gavin Simpson
Ich bin auch auf der Suche nach einer Methode zum drehen von text mit heatmap. Schließlich habe ich es geschafft, zu finden diese Lösung:
Schlüssel-argument ist
srtCol(or srtRow for row labels)
, die verwendet wird, um zu drehen Spalte-Beschriftungen in gplots.InformationsquelleAutor der Antwort Yongsheng Cheng
Einer Lösung mit
lattice::levelplot
undlatticeExtra::dendrogramGrob
:Den Beispiel-Daten:
Definieren Sie die dendrogramms für Zeilen und Spalten (computed
intern in
heatmap
):und übergeben Sie an die
dendrogramGrob
Funktion in derlegend
argument
levelplot
.Ich habe ein neues Thema mit Farben aus
RColorBrewer
, undverändert die Breite und die Farbe der Zellen Grenzen mit
border
und
border.lwd
:Können Sie sogar die
shrink
argument für die Skalierung der Zellen Größeproportional zu Ihrem Wert.
InformationsquelleAutor der Antwort Oscar Perpiñán
Konnte ich Gavin Simpson ' s Antwort und getrimmt, Sie ein wenig für mich arbeiten, für einfache prototyping-Zwecke, wo
data1
ist das zu Lesen.csv () - Objekt, unddata1_matrix
natürlich die matrix produziert vonBoom! Dank Gavin.
Einen Schlüssel bit für diese Arbeit ist der Teil vor dem
add.expr
bit, wo er die labCol "", die notwendig ist, um zu verhindern, dass die ehemaligen (straight-down) Etiketten von überschneidungen mit den neuen 45-Grad-diejenigenInformationsquelleAutor der Antwort boulder_ruby