[R] abline plots at wrong abscissae after boxplot

Sundar Dorai-Raj sundar.dorai-raj at pdf.com
Thu Jun 21 23:59:46 CEST 2007



Brian Wilfley said the following on 6/21/2007 2:44 PM:
> Hi folks,
> 
> I'm using R 2.5.0 under ESS under Windows XP. (This also happens using
> the Rgui application.)
> 
> I'm trying to add lines to a plot originally made with "boxplot", but
> the lines appear in the wrong place. Below is a script that
> illustrates the problem
> 
> # boxablinetest.R - script to show problem with abline on box plot
> 
> x <-  c(  2,  2,  2,  3,  3,  3,  4,  4,  4)
> y <-  c(  1,  2,  3,  2,  3,  4,  3,  4,  5)
> 
> xymodel <- lm( y~x)
> 
> boxplot( y~x)
> abline( xymodel)                        # Wrong abcissae
> abline( v = 2.5)                        # Wrong abcissa
> abline( h = 2.75)                       # Right ordinate
> 
> # -------------- end --------------
> 
> Here, I'm making a box plot with abscissae that start at 2. The box
> plot looks fine: the numbers 2, 3, and 4 appear on the x-axis and the
> boxes are centered at 2, 3, and 4.
> 
> When I add the first abline, the line appears too low, but actually it
> is too far to the right. The abscissae are being interpreted without
> realizing that the plot originates at 2, not 1.
> 
> The second call to abline should put a vertical line between 2 and 3,
> but instead it shows up between 3 and 4. Again, it appears that the
> offset in the origin of the boxplot is not accounted for.
> 
> Finally the last abline appears where it should: between 2 and 3.
> Evidently, ordinate values are correctly interpreted.
> 
> Does anyone have any advice?
> 
> Thanks very much.
> 
> Brian Wilfley
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.


That's because the x is converted to a factor (see ?boxplot). Here's 
what you want:

## changesd x==3 to 6 to demonstrate call to boxplot below
x <- c(2, 2, 2, 3, 3, 3, 6, 6, 6)
y <- c(1, 2, 3, 2, 3, 4, 3, 4, 5)

xymodel <- lm(y ~ x)

boxplot(y ~ x) ## note x-labels!

## now fix your problem
plot(y ~ x, type = "n", xlim = c(1, 7))
bxp(boxplot(y ~ x, plot = FALSE), at = c(2, 3, 6),
     add = TRUE, boxwex = 0.5, boxfill = "lightblue")
abline(xymodel)
abline(v = 2.5)
abline(h = 2.75)

HTH,

--sundar



More information about the R-help mailing list