Thank you very much, Marc! That was exactly the solution I was looking for!

Regards,
Lauri


2007/1/26, Marc Schwartz <marc_schwartz@comcast.net>:
>
> On Thu, 2007-01-25 at 22:23 +0200, Lauri Nikkinen wrote:
> > Hi R-users,
> >
> > I'm new to R and I'm trying to make a barplot combined with two lines
> > (refering to secondary y-axis). Bars should represent the number of
> > transfused patients by age class and sex and lines should represent
> > the amount of blood units given in age classes. I have now successfully
> made
> > a barplot and used par(new=TRUE) to plot another empty graph at the top
> of
> > the barplot.
> >
> > #tab-table:
> > #        ikar_new
> > #sp       0-9 10-19 20-29 30-39 40-49 50-59 60-69 70-79 >80
> > #  mies   227    93    79    92   195   451   560   577 132
> > #  nainen 183    80   102   175    99   161   230   357 164
> >
> > barplot(tab,
> >         beside=TRUE,
> >         col = c("black", "lightgrey"),
> >         legend = rownames(tab),
> >         ylim= c(0,800),
> >         font.main = 4,
> >         cex.names = 1.1,
> >         main = "Transfused patients and trombocytes given by age and
> sex",
> >         ylab="Number of transfused patients",
> >         xlab="Age groups (years)")
> >
> > axis(1, c(0,3.5+3*0:9), labels=FALSE, tick=TRUE)
> >
> > par(new=TRUE)
> >
> > #temp-table
> > #  ikar_new mies nainen
> > #1      0-9 2296   2224
> > #2    10-19 1648   3508
> > #3    20-29 2276   1464
> > #4    30-39 1920   2600
> > #5    40-49 3912   2020
> > #6    50-59 6856   2872
> > #7    60-69 8748   3592
> > #8    70-79 7052   4916
> > #9      >80 1436   1780
> >
> >
> > plot(temp$mies, type="n", yaxt='n', xaxt='n', ann=FALSE)
> > lines(temp$mies, col="blue", lwd=2)
> > lines(temp$nainen, col="red", lwd=2)
> > axis(4, at=NULL)
> >
> > I have used lines() to draw the lines into the picture. How can I get
> the
> > lines into the same x-axis and get the actual data points of the lines
> to
> > be exactly in between the two barplot's bars (categories in x-axis)? Now
> the
> > points which the lines connect are not in the middle of the groups in
> x-axis
> > as I would want them to be. The bars in the barplot are not stacked. I'm
> > sorry that I'm not able to give you the scripts to make those tables.
>
> I suspect that this is what you might require:
>
>
> # Get the maximum value for both sets of data
> # divide the second set by 10 to normalize to the
> # range of the first set
>
> Max.y <- max(tab, as.matrix(temp[, -1]) / 10)
>
>
> # Now do the barplot using c(0, Max.y) for ylim
> # Also save the bar midpoints in 'mp'
> # See ?barplot
>
> mp <- barplot(tab, beside=TRUE,
>              col = c("black", "lightgrey"),
>              legend = rownames(tab),
>              ylim = c(0, Max.y),
>              font.main = 4,
>              cex.names = 1.1,
>              main = "Transfused patients and trombocytes given by age and
> sex",
>              ylab ="Number of transfused patients",
>              xlab ="Age groups (years)")
>
> axis(1, c(0, 3.5 + 3 * 0:9), labels = FALSE, tick = TRUE)
>
>
> # Now add the lines, dividing the y values by 10
> # to fit the y axis range to the first set of data
> # Use colMeans(mp) for the x axis values, which will
> # give the midpoints of each bar pair
>
> lines(colMeans(mp), temp$mies / 10, col = "blue", lwd = 2)
> lines(colMeans(mp), temp$nainen / 10, col = "red", lwd = 2)
>
>
> # Now set the values for the right hand axis
>
> at <- seq(0, 800, 200)
>
>
> # Set the axis labels to y at * 10
>
> axis(4, at = at, labels = at * 10)
>
>
> There are multiple ways to accomplish drawing two sets of data with
> differing ranges on the same plot. Typically they involve the
> normalization of the data to common ranges and then adjustment of the
> axis labelling accordingly.
>
> HTH,
>
> Marc Schwartz
>
>
>

	[[alternative HTML version deleted]]

