Tuesday 6 December 2016

plot - Intelligent point label placement in R




1) Is there any R library/function which would implement INTELLIGENT label placement in R plot? I tried some but they are all problematic - many labels are overlaping either each other or other points (or other objects in the plot, but I see that this is much harder to handle).



2) If not, is there any way how to COMFORTABLY help the algorithm with the label placement for particular problematic points? Most comfortable and efficient solution wanted.



You can play and test other possibilities with my reproducible example and see if you are able to achieve better results than I have:



# data
x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012,
0.9055, 1.3307)

y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542,
0.9717, 0.9357)
ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho",
"SaxRub", "TurMer", "TurPil", "TurPhi")

# basic plot
plot(x, y, asp=1)
abline(h = 1, col = "green")
abline(v = 1, col = "green")



For labelling, I then tried these possibilities, no one is really good:



1) this one is terrible:



text(x, y, labels = ShortSci, cex= 0.7, offset = 10)


2) this one is good if you don't want to place labels for all points, but just for the
outliers, but still, the labels are often placed wrong:




identify(x, y, labels = ShortSci, cex = 0.7)


3) this one looked promissing but there is the problem of labels being too close to the
points; I had to pad them with spaces but this doesn't help much:



require(maptools)
pointLabel(x, y, labels = paste(" ", ShortSci, " ", sep=""), cex=0.7)



4)



require(plotrix)
thigmophobe.labels(x, y, labels = ShortSci, cex=0.7, offset=0.5)


5)



require(calibrate)

textxy(x, y, labs=ShortSci, cx=0.7)


Thank you in advance!



EDIT: todo: try labcurve {Hmisc}.


Answer



I found some solution! It's not ultimate and ideal unfortunatelly, but it's the one that works the best for me now. It's half algoritmic, half manual, so it saves time compared to pure manual solution sketched by joran.



I overlooked very important part of the ?identify help!





The algorithm used for placing labels is the same as used by text if
pos is specified there, the difference being that the position of the
pointer relative the identified point determines pos in identify.




So if you use the identify() solution as I wrote in my question, then you can affect the position of the label by not clicking directly on that point, but by clicking next to that point relatively in the desired direction!!! Works just great!



The downside is that there are only 4 positions (top, left, bottom, right), but I'd more appreciate the other 4 (top-left, top-right, bottom-left, bottom-right)... So I use this to labels points where it doesn't bother me and the rest of the points I label directly in my Powerpoint presentation, as joran proposed :-)




P.S.: I haven't tried the directlabels lattice/ggplot solution yet, I still prefer to use the basic plot library.


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...