2017-01-24 3 views
3

Ich versuche, ein Boxplot mit benutzerdefinierten Achsenbeschriftungen zu machen, aber ich kann nicht scheinen, eine X-Achse zum Plot hinzuzufügen."Achse" wird keine X-Achse zu Boxplot hinzufügen

Zum Beispiel:

test <- data.frame(year=as.integer(rep(1963:2014, each=10)), 
     response=rnorm(520)) 
boxplot(response~year, data=test, ylim=c(-3,3), xlab="", ylab="", 
    range=0, xaxt="n", yaxt="n") 
responselabs <- as.numeric(c(-3:3, by=1)) 
yearlabs <- as.integer(seq(1965,2015, by=5)) 
axis(2, at=responselabs, tck=0.03, las=1) 
axis(1, at=yearlabs, tck=0.03) 

gibt den boxplot, aber keine x-Achsenbeschriftungen:

boxplot with no x axis

Den Versuch, es in die andere Richtung zu hacken, indem zunächst ein leeres Grundstück zu machen, kann ich Holen Sie sich die Achsen, aber es wird nicht das Boxplot hinzugefügt:

plot(NA, ylim=c(-3, 3), xlim=c(1962, 2015), xaxt="n", yaxt="n", ylab="", xlab="") 
axis(2, at=responselabs, tck=0.03, las=1) 
axis(1, at=yearlabs, tck=0.03) 
boxplot(response~year, data=test, ylim=c(-3,3), xlab="", ylab="", 
    range=0, xaxt="n", yaxt="n", add=T) 

empty plot

Was ist hier los?

+1

'boxplot' wahrscheinlich' year' zu einem Faktor umwandelt. Probieren Sie dies aus: 'axis (1, at = 1: length (unique (test $ year)), labels = unique (test $ year))' – bouncyball

Antwort

4

Ich denke, was passiert ist, dass boxplotyear zu einem factor umwandelt. Wir können mithilfe der labels Argument in axis dieses Problem umgehen:

boxplot(response~year, data=test, ylim=c(-3,3), xlab="", ylab="", 
    range=0, xaxt="n", yaxt="n") 
responselabs <- as.numeric(c(-3:3, by=1)) 
yearlabs <- as.integer(seq(1965,2015, by=5)) 
axis(2, at=responselabs, tck=0.03, las=1) 
axis(1, at = yearlabs - 1962, labels = yearlabs) 

enter image description here

+0

Aber das setzt Etiketten wo sie nicht sein sollten ... Test $ Jahr reicht von 1963-2014, aber mit Ihrem Vorschlag reichen die Daten bis 2017 – Patrick

+0

Ich glaube nicht, ich verstehe, es sieht für mich aus, dass die Daten erstreckt bis 2015 auf dem Boxplot (einer rechts neben der Box 2014) – bouncyball

+0

Entschuldigung, es schien so, als ob der ursprüngliche Code nicht richtig funktionierte. Ist es wirklich so einfach wie 1962 zu subtrahieren? – Patrick

2

Warum nicht ggplot2 verwenden?

library(ggplot2) 
p<-ggplot(test,aes(x=year,y=response,group=year))+ 
geom_boxplot()+ 
scale_x_continuous(breaks=round(seq(min(test$year),max(test$year),by=5),1)) 

enter image description here

Wenn Sie im scale_x_continuous() Argument anzupassen der Code ist ziemlich einfach auf die nächsten 5 dann gerundet werden.

p<-ggplot(test,aes(x=year,y=response,group=year))+ 
    geom_boxplot()+ 
    scale_x_continuous(breaks = round(seq(round(min(test$year)/5,0)*5,round(max(test$year)/5,0)*5, by = 5),1)) 

enter image description here

+1

Ihre Antwort enthält nicht das Intervall in den von OP – rbatt

+1

angeforderten X-Achsen-Etiketten @ rbatt bearbeitet w/scale_x_continuous() –

+0

Danke für diese Antwort. Ich mag ggplot, ich habe nur versucht, dies in den Basis-Plot-Funktionen zu behalten, um Zeit zu sparen. – Patrick

0

Wie andere gesagt haben, die Werte verwechselt haben die x-Achse zu Grunde liegen. Herumspielen mit abline() zeigt, dass abline(v=2010) nicht angezeigt wird, aber so etwas wie abline(v=50) wird angezeigt.

Hier ist ein Plot Sie nach, glaube ich (mit einigen zusätzlichen Änderungen):

year_vals <- as.integer(rep(1963:2014, each=10)) # pulling out of next line for easy reference 
test <- data.frame(year=year_vals,response=rnorm(520)) 
boxplot(response~year, data=test, ylim=c(-3,3), xlab="", ylab="", range=0, xaxt="n", yaxt="n") 
responselabs <- as.numeric(c(-3:3, by=1)) 
yearlabs <- year_vals[year_vals%%5==0] # alternate, more general definition; note that 2015 wasn't in the original 'test' data.frame #as.integer(seq(1965,2015, by=5)) 
axis(2, at=responselabs, tck=0.03, las=1) 
# axis(1, at=1:length(yearlabs), tck=0.03) 
axis(1, at=which(unique(year_vals)%in%yearlabs), labels=unique(yearlabs), tck=0.03) 
+0

Das scheint viel komplizierter als es sein muss. – Patrick

Verwandte Themen