gianpaolo.romeo@nectarine.it
2005-Nov-21 10:12 UTC
[R] Plotting one or more series on the same graphs
Hi, I'm from Italy (sorry for my english...). I've two questions about the plot function. I've to create a simple graph for the data set "n_species": species=sqlQuery(dati, "select count(distinct species), season from captures_complete_r group by species, season") n_species=tapply(species$count, species$season, sum) n_species=data.frame(n_species) n_species n_species autumn 10 spring 7 summer 7 winter 7 The problem is that, if I use "plot(n_species)", I can't put the seasons on the x-axis, and so the values on that axes appear as numbers. I've tried to remove the axis and then I've add with the script: plot(n_species, type="l", main="Species trend", xlab="Season", ylab="Number of species",ylim=c(3,10), col=1, axes=FALSE) legend("topright", c("Species captured"), col = c(1), lty=c(1)) axis(1, 1:4, c("autumn", "spring", "summer", "winter") ) axis(2, 1:11) and it seems to work, but when I have decimal value on the y-axis, the script plot(k$simp_seas, ylim=c(min(k), max(k)), type="l",main="Index trend", xlab="Season", ylab="Index value", axes=FALSE) points(k$shan_seas, col="red", type="l") leg.txt=c("Simpson's index", "Shannon's index") legend("topleft", leg.txt, col=c(1,2), lty=c(1,1)) axis(1, 1:4, c("autumn", "spring", "summer", "winter") ) axis(2, 1:11) doesn't put decimal value, but jut a "1" in the middle of the vertical axis. How can make a correct graphs? Thanks, Gianpaolo.
Marc Schwartz (via MN)
2005-Nov-21 19:22 UTC
[R] Plotting one or more series on the same graphs
On Mon, 2005-11-21 at 11:12 +0100, gianpaolo.romeo at nectarine.it wrote:> Hi, I'm from Italy (sorry for my english...). I've two questions about > the plot function. > I've to create a simple graph for the data set "n_species": > > > species=sqlQuery(dati, "select count(distinct species), season from > captures_complete_r group by species, season") > n_species=tapply(species$count, species$season, sum) > n_species=data.frame(n_species) > n_species > n_species > autumn 10 > spring 7 > summer 7 > winter 7 > > > The problem is that, if I use "plot(n_species)", I can't put the seasons > on the x-axis, and so the values on that axes appear as numbers.The problem here is that by default, plot() is using the result of: axTicks(1) as the x labels and tick mark locations, which yields:> axTicks(1)[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 with four data points. Actually, R is using a C coded equivalent of axTicks() internally, but the result is the same. See ?axTicks for more information.> I've tried to remove the axis and then I've add with the script: > > plot(n_species, type="l", main="Species trend", xlab="Season", > ylab="Number of species",ylim=c(3,10), col=1, axes=FALSE) > legend("topright", c("Species captured"), col = c(1), lty=c(1)) > axis(1, 1:4, c("autumn", "spring", "summer", "winter") ) > axis(2, 1:11)This is better and gives you finer control over the axis labels and tick mark locations. However, using axis(2, 1:11) will cause problems as the 'y' ranges of your values change, as you see below.> and it seems to work, but when I have decimal value on the y-axis, the > script > > > plot(k$simp_seas, ylim=c(min(k), max(k)), type="l",main="Index trend", > xlab="Season", ylab="Index value", axes=FALSE) > points(k$shan_seas, col="red", type="l") > leg.txt=c("Simpson's index", "Shannon's index") > legend("topleft", leg.txt, col=c(1,2), lty=c(1,1)) > axis(1, 1:4, c("autumn", "spring", "summer", "winter") ) > axis(2, 1:11) > > doesn't put decimal value, but jut a "1" in the middle of the vertical > axis. > How can make a correct graphs? > > Thanks, Gianpaolo.Since we don't have your actual data, I can provide some guidance, but not a specific solution. In your examples above, you need to exclude the x axis from being drawn, but not the y axis. Using 'axes = FALSE' will preclude both axes from being drawn. Thus: Instead of using 'axes = FALSE', use 'xaxt = "n"', which will preclude the x axis only from being drawn. You will then end up with the default y axis tick marks and labels. See ?par for more information. If you want more control over the y axis values as well, you can continue to use 'axes = FALSE', but will need to consider how you want the tick marks and labels to look and then use those values as the arguments to axis(2, ...) as appropriate, rather than hard coding the values and expecting them to work in all cases. In addition, you might want to take a look at ?matplot, which will enable you to plot multiple series in a single plot. HTH, Marc Schwartz