Simon Kiss
2010-Dec-10 15:25 UTC
[R] 45 Degree labels on barplot? Help understanding code previously posted.
Dear colleagues, i found a line or two of code in the help archives from Uwe Ligges about creating slanted x-labels for a barplot and it works well for my purposes (code below). However, I was hoping someone could explain to me precisely what the code is doing. I'm aware it's invoking the text command, and I know the first ttwo arguments to text are x and y co-ordinates. I'm also aware that par("usr")[3] is grabbing the third element of the vector of plotting co-ordinates. But I tried replacing par("usr")[3] with just "0" and that didn't work; all the labels got bunched up on the left. Is it necessary to create a new object via "barplot" and then quote that in the x,y coordinates of text? Like I said, the code works great, but I'm trying to actually understand the rationale behind the elements so I can apply it in future. Yours, Simon Kiss #Reproducible Code mydat<-data.frame(countries=c("Canada", "Denmark", "Framce", "United Kingdom", "Germany", "Australia", "New Zealand", "Switzerland", "Belgium", "Netherlands"), stories_total=c(429, 25, 239, 99, 100, 96, 18, 21, 0, 6), avg=c(4.165048544, 6.25, 6.459459459, 0.908256881, 1.923076923, 1.103448276, 1.058823529, 1.615384615, 0, 0.107142857), steps=c(2, 2, 2, 0,1, 1, 1, 0,0,0), newspapers=c(103, 4, 37, 109, 52, 87, 17, 13, 10, 56)) mydat.sort1<-mydat[order(-mydat$avg), ] myplot<-barplot(mydat.sort1$avg, col=c("black", "black", "black", "grey", "white", "grey", "grey", "white", "white", "white"), ylim=c(0,7), main="Regulatory Action On Bisphenol A By Newspaper Coverage") col.vec=c("black", "grey", "white") legend("topright", col=col.vec, fill=c("black", "grey", "white"), legend=c("Meaningful Ban", "Recommendations To Withdraw", "No Legislative Action")) labels=mydat.sort1$countries #These lines create the labels text(myplot, par("usr")[3], labels=labels, srt=35, offset=1, adj=1, xpd=TRUE) axis(2) par("usr")[3] ********************************* Simon J. Kiss, PhD Assistant Professor, Wilfrid Laurier University 73 George Street Brantford, Ontario, Canada N3T 2C9 Cell: +1 519 761 7606
David Winsemius
2010-Dec-10 18:41 UTC
[R] 45 Degree labels on barplot? Help understanding code previously posted.
On Dec 10, 2010, at 10:25 AM, Simon Kiss wrote:> Dear colleagues, > i found a line or two of code in the help archives from Uwe Ligges > about creating slanted x-labels for a barplot and it works well for > my purposes (code below). However, I was hoping someone could > explain to me precisely what the code is doing. > I'm aware it's invoking the text command, and I know the first ttwo > arguments to text are x and y co-ordinates. I'm also aware that > par("usr")[3] is grabbing the third element of the vector of > plotting co-ordinates.More accurately the limits of the plot area in plot dimensions.> But I tried replacing par("usr")[3] with just "0" and that didn't > work; all the labels got bunched up on the left.That was the "y" argument, not the rotation argument. (Which means I am surprised that it bunched things to the side ... and for me it did nothing at all... same graphic.) It is the srt argument that controls the angle.> Is it necessary to create a new object via "barplot"That gives you appropriate positions for the labels in plot coordinate terms and the xpd argument allows these locations to be used outside the plot area.> and then quote that in the x,y coordinates of text?What do you mean by "then quote it in the x,y,coordinates"? I don't see any quotes. You could of course just look at the plot area and supply your own locations. You would need to figure out what the unlabeled x-axis scale really was, but that too is documented. -- David.> Like I said, the code works great, but I'm trying to actually > understand the rationale behind the elements so I can apply it in > future. > Yours, Simon Kiss > > #Reproducible Code > mydat<-data.frame(countries=c("Canada", "Denmark", "Framce", "United > Kingdom", "Germany", "Australia", "New Zealand", "Switzerland", > "Belgium", "Netherlands"), stories_total=c(429, 25, > 239, 99, 100, 96, 18, 21, 0, 6), avg=c(4.165048544, 6.25, > 6.459459459, 0.908256881, 1.923076923, 1.103448276, 1.058823529, > 1.615384615, 0, 0.107142857), steps=c(2, 2, 2, 0,1, 1, 1, 0,0,0), > newspapers=c(103, 4, 37, 109, 52, 87, 17, 13, 10, 56)) > mydat.sort1<-mydat[order(-mydat$avg), ] > myplot<-barplot(mydat.sort1$avg, col=c("black", "black", "black", > "grey", "white", "grey", "grey", "white", "white", "white"), > ylim=c(0,7), main="Regulatory Action On Bisphenol A By Newspaper > Coverage") > col.vec=c("black", "grey", "white") > legend("topright", col=col.vec, fill=c("black", "grey", "white"), > legend=c("Meaningful Ban", "Recommendations To Withdraw", "No > Legislative Action")) > labels=mydat.sort1$countries > #These lines create the labels > text(myplot, par("usr")[3], labels=labels, srt=35, offset=1, adj=1, > xpd=TRUE) > axis(2) > par("usr")[3] > > ********************************* > Simon J. Kiss, PhD > Assistant Professor, Wilfrid Laurier University > 73 George Street > Brantford, Ontario, Canada > N3T 2C9 > Cell: +1 519 761 7606 > > ______________________________________________ > R-help at r-project.org 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.David Winsemius, MD West Hartford, CT
Jim Lemon
2010-Dec-11 09:51 UTC
[R] 45 Degree labels on barplot? Help understanding code previously posted.
On 12/11/2010 02:25 AM, Simon Kiss wrote:> Dear colleagues, > i found a line or two of code in the help archives from Uwe Ligges about creating slanted x-labels for a barplot and it works well for my purposes (code below). However, I was hoping someone could explain to me precisely what the code is doing. > I'm aware it's invoking the text command, and I know the first ttwo arguments to text are x and y co-ordinates. I'm also aware that par("usr")[3] is grabbing the third element of the vector of plotting co-ordinates. But I tried replacing par("usr")[3] with just "0" and that didn't work; all the labels got bunched up on the left. Is it necessary to create a new object via "barplot" and then quote that in the x,y coordinates of text? > Like I said, the code works great, but I'm trying to actually understand the rationale behind the elements so I can apply it in future.Hi Simon, The staxlab function will add an axis to an existing plot with either staggered or rotated labels. It is somewhat similar to Uwe's function. Looking at both the code and the examples on the help page might give you some idea why the function was written. It is principally to allow the user to add more labels than would be displayed on the default axes, and to decide whether staggering or rotating those labels will produce a better looking plot. The problem most often mentioned in adding custom labels to a plot produced by barplot is that the bars are centered on non-integer values, and so the user must get the return value of barplot and use that for the axis label positions. Jim