2016-07-26 42 views
3

Ich würde gerne Tick-Etiketten mit hochgestellten wie in Mylabels im folgenden Beispiel machen. Allerdings möchte ich sie nicht Hand-Code, ich möchte, dass sie 3^STUFEN gehen, in denen die Werte eine KonstanteR: Erzeugen Sie plot axis break Etiketten mit superscripts programmatisch (Schwerpunkt auf die programmatische)

library(ggplot2) 

LEVELS = 4 

mylabels = c(
    expression(paste(3^4,"= 81")), 
    expression(paste(3^3,"= 27")), 
    expression(paste(3^2,"= 9")), 
    expression(paste(3^1,"= 3")), 
    expression(paste(3^0,"= 1"))) 
mylabels 
length(mylabels) 


df=data.frame(x=runif(40),y=(runif(40)*10)%%5) 
p = ggplot(df,aes(x,y)) + 
    geom_point() + 
    scale_y_continuous(breaks = 0:LEVELS, labels = mylabels) 
p 

Die hart codiert verison perfekt funktioniert. Aber ich kann es nicht programmatisch bekommen. Die folgende:

mylabels=c(paste("expression(paste(3^",LEVELS:0,'," = ',3^(LEVELS:0),'"))',sep="")) 

nicht ordnungsgemäß in der Tabelle bewerten (zum Beispiel schreibt das Wort ‚Ausdruck‘ usw. in dem Etikett). Es schafft:

[1] "expression(paste(3^4,\" = 81\"))" "expression(paste(3^3,\" = 27\"))" "expression(paste(3^2,\" = 9\"))" 
[4] "expression(paste(3^1,\" = 3\"))" "expression(paste(3^0,\" = 1\"))" 

und was ich will, ist:

expression(paste(3^4, "= 81"), paste(3^3, "= 27"), paste(3^2, 
"= 9"), paste(3^1, "= 3"), paste(3^0, "= 1")) 

Haben etwa mit Zusammenbruch messed, noquote, eval, sprintf usw.

Antwort

3

Sie müssen den Expressionsvektor, wie ein bauen Zeichenvektor zuerst, und analysieren Sie es dann unter Verwendung parse(), der einen dem Eingabezeichenvektor entsprechenden Ausdruckvektor zurückgibt. Den Bau der Zeichenvektor wird am besten mit sprintf():

mylabels <- parse(text=sprintf('paste(3^%d,\' = %d\')',LEVELS:0,3^(LEVELS:0))); 
mylabels; 
## expression(paste(3^4,' = 81'), paste(3^3,' = 27'), paste(3^2,' = 9'), 
##  paste(3^1,' = 3'), paste(3^0,' = 1')) 

plot


Weitere Tipps:

1: Wenn Beispielcode bereitstellt, die auf Erzeugung von Zufallszahlen abhängig ist, wenden Sie sich bitte set.seed() bevor irgendeine Zufälligkeit erzeugt wird.

2: Die Funktion expression() ist variadisch und gibt einen Ausdrucksvektor zurück, dessen Elemente den Eingabeargumenten entsprechen. Vermeiden Sie redundante Anrufe c(): Somit können Sie

c(
    expression(paste(3^4,"= 81")), 
    expression(paste(3^3,"= 27")), 
    expression(paste(3^2,"= 9")), 
    expression(paste(3^1,"= 3")), 
    expression(paste(3^0,"= 1")) 
) 

mit

expression(
    paste(3^4,"= 81"), 
    paste(3^3,"= 27"), 
    paste(3^2,"= 9"), 
    paste(3^1,"= 3"), 
    paste(3^0,"= 1") 
) 

3 ersetzen. Sie können

c(paste("expression(paste(3^",LEVELS:0,'," = ',3^(LEVELS:0),'"))',sep="")) 

mit

paste("expression(paste(3^",LEVELS:0,'," = ',3^(LEVELS:0),'"))',sep="") 
+1

plus1 gut gemacht ersetzen .. Ich war auf diese zu viel Zeit zu verschwenden. (Scheint du kannst es vereinfachen 'mylabels <- parse (text = sprintf ('3 ^% d ==% d', LEVELS: 0, 3^(LEVELS: 0))) ', aber ich weiß nicht, ob das kommen wird zurück und beißen – user20650

+1

@ user20650 Excellent Punkt, funktioniert Ihre Vereinfachung hier.Der einzige Nachteil ist, dass, wenn das Stück der Bezeichnung rechts von der '3 ^% d 'nicht gültig R-Syntax wäre, dann würde es nicht funktionieren, weil 'parse()' wäre nicht in der Lage, es in einen gültigen R-Syntaxbaum zu zerlegen, aber da es in diesem Fall eine gültige Syntax ist, funktioniert es. – bgoldst