How to define fixed aspect-ratio for (base R) scatter-plot
Asked Answered
L

2

50

I am plotting correlation coefficients (values = 0.0:1.0) for two isotopes measured in each individual from two populations. I would like to have a fixed aspect-ratio for my scatter-plot so that the x- and y-axis are exactly the same size no matter the graphics device. Suggestions?

This is my first plot in R, any comments on refinements to my code is appreciated? Finally, is it worth investing in learning the basic plotting techniques or should I jump right to ggplot2 or lattice?

My plot script:

## Create dataset
WW_corr <-
structure(list(South_N15 = c(0.7976495, 0.1796725, 0.5338347,
0.4103769, 0.7447027, 0.5080296, 0.7566544, 0.7432026, 0.8927161
), South_C13 = c(0.76706752, 0.02320767, 0.88429902, 0.36648357,
0.73840937, 0.0523504, 0.52145159, 0.50707858, 0.51874445), North_N15 = c(0.7483608,
0.4294148, 0.9283554, 0.8831571, 0.5056481, 0.1945943, 0.8492716,
0.5759033, 0.7483608), North_C13 = c(0.08114805, 0.47268136,
0.94975596, 0.06023815, 0.33652839, 0.53055943, 0.30228833, 0.8864435,
0.08114805)), .Names = c("South_N15", "South_C13", "North_N15",
"North_C13"), row.names = c(NA, -9L), class = "data.frame")

opar <- par()

## Plot results
par(oma = c(1, 0, 0, 0), mar = c(4, 5, 2, 2))           
plot(1,1,xlim=c(0:1.0), ylim=c(0:1.0), type="n", las=1, bty="n", main = NULL,
     ylab=expression(paste("Correlation Coefficient (r) for ", delta ^{15},"N ",
                     "\u0028","\u2030","\u0029")),
     xlab=expression(paste("Correlation Coefficient (r) for ", delta ^{13},"C ",
                     "\u0028","\u2030","\u0029")))

points(WW_corr$South_N15, WW_corr$South_C13, pch = 23, cex = 1.25, 
       bg ="antiquewhite4", col = "antiquewhite4")
points(WW_corr$North_N15, WW_corr$North_C13, pch = 15, cex = 1.25,
       bg ="black")
axis(1, at = seq(0, 1.0, by = 0.1), labels = F, tick = TRUE, tck = -0.01)
axis(2, at = seq(0, 1.0, by = 0.1), labels = F, tick = TRUE, tck = -0.01)
abline(h=.86, v=.86, col = "gray60", lty = 2)
legend("topleft", c("North", "South"), pch = c(15, 23), 
       col = c("black", "antiquewhite4"), pt.bg = c("black", "antiquewhite4"),
       horiz=TRUE, bty = "n")

par(opar)
Levileviable answered 1/1, 2012 at 14:26 Comment(3)
Yeah, do as I say and not as I do :-), and learn ggplot .Rapture
You've clearly got the basics of base graphics down pretty well, so I would recommend at least getting a feel for ggplot2/lattice, since given the quality of this question it won't be a huge time investment for you. They are quite different, but you'll pick them up quickly. Once you have a sense of the general syntax+flow of each you'll be able to decide which one you want to spend most of your time in. But it's very worthwhile to have a basic familiarity with each.Jaundiced
Would love to see a picture of the final plot!Peggypegma
R
55

Using asp=1 as a parameter to plot will get interpreted by the low-level plot.window call and should give you a unitary aspect ratio. There is the potential that a call using ylim and xlim could conflict with an aspect ratio scpecification and the asp should "prevail". That's a very impressive first R graph, by the away. And an excellent question construction. High marks.

The one jarring note was your use of the construction xlim=c(0:1.0). Since xlim expects a two element vector, I would have expected xlim=c(0,1). Fewer keystrokes and less subject to error in the future if you changed to a different set of limits, since the ":" operator would give you unexpected results if you tried that with "0:2.5".

Recalesce answered 1/1, 2012 at 15:8 Comment(2)
Thanks! Yes, my mistake on the x- and ylim use of colon versus comma. I guess I lucked out I was using 0 to 1 rather than 0 to 2.5. I am still a bit unclear about the difference between using asp = 1 versus asp = TRUE.Levileviable
TRUE == 1, so no difference. But you could use other aspect ratios besides 1.Recalesce
A
62
par(pty="s")
plot(...)

sets the plot type to be square, which will do the job (I think) in your case because your x and y ranges are the same. Fairly well hidden option documented in ?par.

Alleyn answered 6/1, 2012 at 18:46 Comment(0)
R
55

Using asp=1 as a parameter to plot will get interpreted by the low-level plot.window call and should give you a unitary aspect ratio. There is the potential that a call using ylim and xlim could conflict with an aspect ratio scpecification and the asp should "prevail". That's a very impressive first R graph, by the away. And an excellent question construction. High marks.

The one jarring note was your use of the construction xlim=c(0:1.0). Since xlim expects a two element vector, I would have expected xlim=c(0,1). Fewer keystrokes and less subject to error in the future if you changed to a different set of limits, since the ":" operator would give you unexpected results if you tried that with "0:2.5".

Recalesce answered 1/1, 2012 at 15:8 Comment(2)
Thanks! Yes, my mistake on the x- and ylim use of colon versus comma. I guess I lucked out I was using 0 to 1 rather than 0 to 2.5. I am still a bit unclear about the difference between using asp = 1 versus asp = TRUE.Levileviable
TRUE == 1, so no difference. But you could use other aspect ratios besides 1.Recalesce

© 2022 - 2024 — McMap. All rights reserved.