Adding text labels to a scatter plot in R is easy. The basic function is `text()`, and here’s a reproducible example how you can use it to create these plots:

For the example, I’m creating random data. Since the data are random, your plots will look different. In this fictitious example, I look at the relationship between a policy indicator and performance. It is conventional to put the outcome variable on the Y axis and the predictor on the X axis, but in this example there’s no relationship to reality anyway… The reason I chose min and max values for the random variables here is that I jotted down this code as an explanation for a replication. In this example, we have 25 observations, for 25 units I call “cantons”. The third line here creates a string of characters “A” to “Y”, these are the labels!

`policy = runif(25, min=0.4, max=0.7)perfor = runif(25, min=500, max=570)canton = sapply(65:89, function(x) rawToChar(as.raw(x)))`

For the scatter plot on the left, we use `plot()`. Then we add the trend line with` abline()` and `lm()`. To add the labels, we have` text()`, the first argument gives the X value of each point, the second argument the Y value (so R knows where to place the text) and the third argument is the corresponding label. The argument `pos=1` is there to tell R to draw the label underneath the point; with `pos=2` (etc.) we can change that position.

`plot(policy ~ perfor, bty="n", ylab="Policy Indicator", xlab="Performance", main="Policy and Performance")abline(lm(policy ~ perfor), col="red")text(perfor, policy, canton, pos=1)`

The scatter plot on the right is similar, but here we actually plot the labels instead of the dots. There are two differences in the code: First, we add `type="n"` to create the scatter plot without actually drawing any circles (an empty plot if you will). Second, when we add the text in the third line of the code, we do not have `pos=1`, because we want to place the labels exactly where the points are.

`plot(policy ~ perfor, bty="n", type="n", ylab="Policy Indicator", xlab="Performance", main="Policy and Performance")abline(lm(policy ~ perfor), col="red")text(perfor, policy, canton)`