Variieren die Farben von Achsenbeschriftungen in R basierend auf anderen Variablen
Ich in der Regel mit ggplot2, aber in diesem Fall bin ich mit dem regelmäßigen image()
Funktion zum zeichnen einer heatmap von einem großen Datensatz. Ich kann label alle des labels, wie rot, aber ich möchte die Beschriftung der y-Achse mit text in verschiedenen Farben basierend auf einem Vektor der Farbe, die Definitionen, die ich generieren:
grid = structure(c(1:12),.Dim = c(4,3))
labs = c("A","B","C")
image(1:4,1:3,grid,axes=FALSE, xlab="", ylab = "")
#This works but isn't the colors I want
axis(2,at=1:length(labs),labels=labs,las=2, adj=1,cex.axis=0.6,col.axis="red")
Generiert das folgende Bild:
Ich würde gerne labels A und C werden schwarz und B rot. Dies ist, was ich versucht habe, aber es gibt eine "falsche Länge" Fehler...
axiscolors = c("black","red","black")
axis(2,at=1:length(labs),labels=labs,las=2, adj=1, cex.axis=0.6, col.axis=axiscolors)
Dies ist der Effekt, den ich bin danach mit ein paar "echte" Daten...
EDIT:
Als back-up, falls dies möglich ist, in ggplot2, ich könnte bereit sein, zu re-factor meinem code. Es gibt ein paar andere Anwendungen die ich benutzen würde für diese als gut.
Ich herausgefunden, einen Weg zu zeichnen eine Schicht von roten Symbole über der Spitze des alten labels, aber würde es vorziehen, eine native-Methode mit der Farbe, Vektor, wenn möglich...
sublabs = c("B")
axis(2,at=match(sublabs,labs),labels=sublabs,las=2, adj=1, cex.axis=0.6, col.axis="red")
Andere Weg wäre, um text()
wenn ich könnte die Etiketten außerhalb der Handlung Raum...
text(c(1,1,1),c(1,2,3),labs,col=c("black","red","black"))
UPDATE: Siehe weiter unten für eine Lösung, die mit ggplot2
...
- Ich glaube nicht, dass Sie finden ein "native-Methode". Es ist eine ziemlich starke kulturelle Widerstand unter den R Autoren zu dem, was einige Leute nennen würde "chart-junk".
- Interessant. Ich bin ein die-hard Tufte-ein, aber eine person die "chart-junk" ist eine andere person Informationen. (In den non-Spielzeug-Beispiel habe ich 91 Werte auf der y-Achse und bin Etikettierung der 16 neu durchsetzt Zeilen zu markieren, wo Sie herauskommen.)
- Ich habe mir den code, der ist ausgesetzt, ein normaler Benutzer und nicht sehen, alles, was gehackt werden in reiner R für
graphics::axis
. Ich Frage mich, ob raster-Grafiken möglicherweise eine Angriffsmöglichkeit. Ich sehe, dass es ist ein lattice-version vonlattice::axis.default
und es sieht aus wie die 'tun.Etiketten Abschnitt wäre vielversprechend. Sie müssen möglicherweise auch hacklattice::panel.axis
. ?mtext
statt?text
wäre der Weg zu gehen.- Vielleicht könnten Sie verwenden
layout
zu erstellen, die unabhängige Achse Etiketten und positionieren Sie Sie nah am original graph ohne Achsenbeschriftungen. Aber das scheint mehr Arbeit als das zeichnen einer Schicht von neuen Symbolen über die alten Symbole. Vielleicht könnten Sie Ihre positiontext
- Anweisung außerhalb der Zeichnungsfläche Bereich mitouter
,inset
- und/odermar
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie ignorieren die vektorisierte Möglichkeiten wie
text
undmtext
ist, können Sie es durch mehrmaligeaxis
. Der Aufwand zeitlich sehr gering und es können alle dieaxis
Berechnungen auftreten, wie Sie es normalerweise tun. E. g.:Ergibt:
axis()
Befehl eher als Feinabstimmung der position dertext
.Annahme @thelatemail Antwort als die flexibelste, aber es stellt sich auch heraus, ziemlich einfach mit
text()
wenn Sie hinzufügenxpd = TRUE
zu ermöglichen Plotten, die außerhalb des Rahmens. Mitmtext()
auch funktionieren, aber es nicht erlauben, Sie zu drehen Etiketten.UPDATE für ggplot2: Sie können
theme()
undelement_text
um die Farben und andere Parameter. So etwas wie dieses...Könnten Sie einen Vektor mit den Farben, die Sie anwenden möchten, um die Etiketten und dann eine Schleife verwenden, um die Etiketten farbig mit axis(). Im folgenden Beispiel verwende ich eine andere Farbe für jede Ebene ein Punkt-Diagramm.
axis(side=2, at=as.numeric(DF$habitat), col.axis=as.character(DF$color), labels=DF$habitat, las=1)
Mag ich sehr, thelatemail Ansatz, und kann nur hinzufügen, eine kleine Verfeinerung, da die festen "zu" Positionen (wie im Beispiel oben mit
at = 1:3
) funktionierte nicht gut für mich. In meinem Fall, ich brauchte, um zu erzeugen ein barplot-und meine eigenen Werte für Raum und Breite Parameter. Am Ende, was ich benutzt aussieht (Beispiel mit zufälligen Daten, in die ich wollte die bars und Etiketten für positive (nicht-negative, um genauer zu sein) Daten Werte werden grün und rot sonst. Für dieses Beispiel benutze ich auch dieletters
- Funktion, um Etiketten und drehen Sie die Etiketten mitlas = 2
):