2015-05-04 9 views
9

Dies kann am Ende eine expression oder call Frage sein, aber ich versuche, einzelne Achsenbeschriftungen bedingt zu formatieren.Dynamische Formatierung einzelner Achsenbeschriftungen in ggplot2

Im folgenden Beispiel, würde Ich mag, um selektiv fett einer der Achsenbeschriftungen:

library(ggplot2) 

data <- data.frame(labs = c("Oranges", "Apples", "Cucumbers"), counts = c(5, 10, 12)) 

ggplot(data = data) + 
    geom_bar(aes(x = labs, y = counts), stat="identity")` 

No Bolding

Es ähnliches Problem ist here, aber die Lösung beinhaltet theme und element_text. Ich versuche, Achsenbeschriftungen direkt zu verwenden.

Ich kann dies wie unten manuell tun:

breaks <- levels(data$labs) 
labels <- breaks 
labels[2] <- expression(bold("Cucumbers")) 

ggplot(data = data) + 
    geom_bar(aes(x = labs, y = counts), stat="identity") + 
    scale_x_discrete(label = labels, breaks = breaks) 

Bolded

Aber, wenn ich versuche, es durch Indizierung zu tun, anstatt die Eingabe out „Gurken“, bekomme ich folgende Fehlermeldung:

breaks <- levels(data$labs) 
labels <- breaks 
labels[2] <- expression(bold(labels[2])) 

ggplot(data = data) + 
    geom_bar(aes(x = labs, y = counts), stat="identity") + 
    scale_x_discrete(label = labels, breaks = breaks) 

Welche s macht ense, weil es die labels[2] nicht auswertet. Aber weiß jemand, wie man es dazu zwingt? Vielen Dank.

Antwort

11

Wie wäre es

breaks <- levels(data$labs) 
labels <- as.expression(breaks) 
labels[[2]] <- bquote(bold(.(labels[[2]]))) 

ggplot(data = data) + 
    geom_bar(aes(x = labs, y = counts), stat="identity") + 
    scale_x_discrete(label = labels, breaks = breaks) 

Hier haben wir noch deutlicher über die Umstellung auf Ausdruck und wir verwenden bquote() den Wert des Labels in den Ausdruck selbst einzufügen.

+0

Ja! 'bquote' und'.() 'waren was ich brauchte. Vielen Dank. Gibt es eine Mnemonik für diesen Funktionsnamen? Rückwärts Zitat? – Sealander

+0

Von der Hilfeseite ist es "ein Analogon des LISP-Backquote-Makros", das ist ziemlich nah. – MrFlick

+0

@MrFlick Wie könnte ich das für mehrere Elemente tun? Zum Beispiel für Position 2 und 3? Und auch könnte ich dies durch Spezifizieren der Faktornamen, z.B. "Gurken" und "Orangen"? Vielen Dank! – Stefan

2

Eine weitere Option ist die Schriftart dynamisch mit theme zu setzen, obwohl ich nicht sicher bin, ob dies in irgendeiner Weise eine bessere oder schlechtere Methode als @ MrFlick Antwort:

breaks <- levels(data$labs) 

# Reference breaks by name 
toBold = "Cucumbers" 

ggplot(data = data) + 
    geom_bar(aes(x = labs, y = counts), stat="identity") + 
    scale_x_discrete(label = labels, breaks = breaks) + 
    theme(axis.text.x= 
     element_text(face=ifelse(breaks %in% toBold, "bold", "plain"))) 

# Reference breaks by position 
label.index=2 

ggplot(data = data) + 
    geom_bar(aes(x = labs, y = counts), stat="identity") + 
    scale_x_discrete(label = labels, breaks = breaks) + 
    theme(axis.text.x= 
     element_text(face=ifelse(breaks %in% labels[match(label.index, 1:length(breaks))], 
           "bold", "plain"))) 
Verwandte Themen