A simple fix is to alternate placing labels on the left and right. I've ordered the dataset by x-value then y-value, so nearby points are near in the dataset.
library(plyr)
df <- arrange(df, xvalue, yvalue)
offset <- rep(c(-300, 300), length.out = nrow(df))
with(df, plot(xvalue, yvalue, #as before
pch=c(16,17)[class],
col=c("red", "blue", "green")[class],
main="Tittle",
))
with(df, text(xvalue + offset, yvalue, cex=0.5, sprintf("(%s, %s)", xlabel, ylabel)))
If you use lattice or ggplot (rather than base graphics) instead then the directlabels
package has a direct.label
function that automatically positions your labels.