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