Jim,
I finally got back to this implementation of mine and dude, this function is
amazing! Thank you so much!
Joh
On Saturday 05 January 2008 11:42:30 Jim Lemon wrote:
Johannes Graumann wrote:
Dear all,
As you can see from the attachment I'm using R to automatically annotate
peptide fragmentation mass spectra, which are represented by impulse
plots. I'd like to poll you on approaches of how to deal as generally as
possible with the two biggest annotation issues I run into:
1) very close annotated masses (impulses) with similar y-axis dimensions
- resulting in overlapping labels
2) very close annotated masses with widely differing y-axis dimensions -
resulting in the label for the smaller one partially overplotting the
impulse of the larger one
Both cases can be seen in the appended png: for 1) see x of aprox. 1100,
for 2) x of aprox. 575
If one does this manually one would write the labels somewhere where
there's plenty of space and then connect them with lines to the
impulses/masses they actually represent ...
Any insight in how to make this pretty(er) automatically is highly
appreciated.
Hi Joh,
I would have loved to say that you could do this with the prettyR
package, but I'll have to settle for plotrix. I realized that the
spread.labels function would almost do what you want. With a minor
change, as in the function below, I think it might get you there.
spread.labels-function (x,y,labels=NULL,spready=NA,
offsets,bg=white,border=FALSE,between=FALSE,
linecol=par(fg),...) {
if(missing(x))
stop(Usage: spread.labels(x,y,labels,...))
ny-length(y)
if(between) {
if(length(linecol)==1) linecol-rep(linecol,2)
nlabels-length(labels)
newy-seq(y[1],y[ny],length=nlabels)
# put the labels in the middle
labelx-rep(mean(x),nlabels)
# do the left lines
segments(x[1:nlabels],y[1:nlabels],
labelx-strwidth(labels)/2,newy,col=linecol[1])
# now the right lines
segments(x[(nlabels+1):ny],y[(nlabels+1):ny],
labelx+strwidth(labels)/2,newy,col=linecol[2])
boxed.labels(labelx,newy,labels,bg=bg,
border=border,...)
}
else {
if(is.na(spready))
spready-diff(range(x))diff(range(y))
if(spready) {
sort.index-sort.list(y)
x-x[sort.index]
y-y[sort.index]
newy-seq(y[1],y[ny],length=length(labels))
if(missing(offsets)) {
offset-diff(par(usr)[1:2])/4
offsets-rep(c(offset, -offset), ny/2 + 1)[1:ny]
}
segments(x+offsets,newy,x,y)
boxed.labels(x+offsets,newy,labels[sort.index],
bg=bg,border=border,...)
}
else {
sort.index-sort.list(x)
x-x[sort.index]
y-y[sort.index]
nx-length(x)
newx - seq(x[1],x[nx],length=length(labels))
if(missing(offsets)) {
offset-diff(par(usr)[3:4])/4
offsets-rep(c(offset,-offset),nx/2+1)[1:nx]
}
segments(newx,y+offsets,x,y)
boxed.labels(newx,y+offsets,labels[sort.index],
bg=bg,border=border,...)
}
}
}
Try calling it like this:
spread.labels(x=x values,y=y values,
labels=your labels,spready=FALSE,
offsets=rep(1,number of labels),
srt=90)
By passing different offsets you may be able to fix some of the really
bad crowding on the labels.
Jim
signature.asc
Description: This is a digitally signed message part.
__
R-help@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.