2017-05-12 2 views
1

Ich möchte Textlabels zu einem Diagramm hinzufügen, die sowohl fett als auch normale Schriftart für mehrere Etiketten enthalten, die in einem Vektor gespeichert sind.Wie kann ich einen Vektor von Etiketten mit Fettschrift und normaler Schrift auf einer Zeichnung anzeigen?

Während ich es für ein einzelnes Label geschafft habe (in der Beispieldarstellung unten grün dargestellt), scheiterte ich, wenn ich mehrere Labels habe, die ich mit einem einzigen Textanruf anzeigen möchte (rot in der Handlung).

Hier ist ein Beispiel, das die Handlung unten erstellt:

plot(0,ylim=c(1,10),xlab="",ylab="",xaxt="n",yaxt="n") 

mylabels <- c("Some text in bold: normal text", "Some other text in bold: more normal text") 
text(x=rep(1, 2), y=c(10,9), labels=mylabels) 

# change labels to show bold font before the colon and normal behind 
mylabels.bold <- gsub("$","')", gsub(":", "'), ':", gsub("^","paste(bold('", mylabels))) 
#> mylabels.bold 
#[1] "paste(bold('Some text in bold'), ': normal text')"   
#[2] "paste(bold('Some other text in bold'), ': more normal text')" 

# this works 
text(x=1, y=8, labels=parse(text=mylabels.bold[1]), col="green") 

# this doesn't 
parsetext <- function(x) { parse(text=x) } 
text(x=rep(1, 2), y=c(7,6), labels=lapply(mylabels.bold,parsetext), col="red") 

example with labels in bold and normal font

Die Frage ist also: Wie kann ich den roten Text aussehen wie das Grün erhalten?

Antwort

1

Dies ist eine Möglichkeit, dies zu tun. Anstatt also das Argument labels einzuschleifen, können Sie eine Schleife nach außen machen, sodass Sie die Beschriftungen einzeln hinzufügen.

plot(0, ylim=c(1,10), xlab="", ylab="", xaxt="n", yaxt="n") 
xs <- rep(1, 2) 
ys <- c(6, 7) 
for (i in seq_along(mylabels.bold)) { 
    text(x = xs[i], y = ys[i], labels = parse(text=mylabels.bold[1]), col = "red") 
} 

Eine andere Lösung wäre, zu tun:

plot(0,ylim=c(1,10),xlab="",ylab="",xaxt="n",yaxt="n") 
parsetext <- function(x) { parse(text=x) } 
text(x=rep(1, 2), y=c(7,6), labels=sapply(mylabels.bold,parsetext), col="red") 

Wenn Sie die Dokumentation von ?text lesen, werden Sie sehen, dass die Etiketten benötigen ein Zeichen Vektor oder Ausdruck. lapply erstellt eine Liste und deshalb schlägt sie fehl. sapply auf der anderen Seite erstellt einen Vektor und funktioniert.

Out:

enter image description here

+0

Danke, das funktioniert in der Tat. Dennoch wäre ich daran interessiert, eine Lösung mit lapply() zu sehen; oder zu verstehen, warum in meinem obigen Beispiel nicht funktioniert. Irgendjemand? – Stefan

+0

Ich aktualisierte meine Antwort. 'lapply' funktioniert nicht, weil' labels' ein Zeichenvektor sein muss. "Lapply" erstellt jedoch eine Liste, so dass es nicht funktioniert. Ich habe das in 'sapply' geändert, was einen Zeichenvektor erzeugt und jetzt funktioniert es. – LyzandeR

Verwandte Themen