[R] adding value labels on Interaction Plot

Paul Johnson pauljohn32 at gmail.com
Wed Mar 4 19:34:13 CET 2009

On Wed, Mar 4, 2009 at 10:52 AM, Dimitri Liakhovitski <ld7631 at gmail.com> wrote:
> Hello - and sorry for what might look like a simple graphics question.
> I am building an interaction plot for d:
> d=data.frame(xx=c(3,3,2,2,1,1),yy=c(4,3,4,3,4,3),zz=c(5.1,4.4,3.5,3.3,-1.1,-1.3))
> d[[1]]<-as.factor(d[[1]])
> d[[2]]<-as.factor(d[[2]])
> print(d)
> interaction.plot(d$xx, d$yy, d$zz,
>  type="b", col=c("red","blue"), legend=F,
>  lty=c(1,2), lwd=2, pch=c(18,24),
>  xlab="X Label",
>  ylab="Y Label",
>  main="Chart Label")
> I am trying and not succeeding in adding Y values (value labels in
> Excel speak) near the data points on 3 lines of the graph.
> I understand that I might have to use "text". But how do I tell text
> to use the actual coordinates of the dots on the lines?
> Thank you very much!

I'm not understanding your trouble, exactly. I had not heard of
"interaction.plot" before and so I've run your code and it is an
interesting function. Thanks for providing the working example.

I can help you with the text.

It is easy to add text. A commmands like

text( 1.3, 1, "whatever", pos=3)

will put the word "whatever" on top of coordinates x and y. (you leave
out pos=3 and R centes the text on the coordinates).

If you need to find out x , y before running that, you can.  the
locator function will return coordinates. Run


and then left click on a point in the graph. Coordinates will pop out
on the screen.

And you can make the text placement depend on locator

text(locator(1), "whatever", pos=3)

I don't think you want to do that work interactively, however.  It can
be automated.

You can add a column of names in your data frame and more or less
automate the plotting as well.  I did this to test.

mylabels <- c("A","B","C","D","E","F")
text(d$xx,d$zz, mylabels, pos=3)

This almost works perfectly, but it plops the labels in the wrong spots.

I'd like to change the command so that the position of the text for
the red line would be on the right, while the position of the text for
the blue line is on the left.

It appears to me your variable yy is the one that separates the 2
lines. Correct? I observe:

[1] 2 1 2 1 2 1

We want the blue ones on the left, for them we need pos=2. For the
others, we want pos=4

Ach. I tried this

text( d$xx, d$zz, mylabels, pos=2*as.numeric(d$yy))

but it comes out backward.  So how about this:

text( d$xx, d$zz, mylabels, pos=as.numeric(d$yy))

That positions the red ones below the line and the blue ones to the
left.  That doesn't look too bad to me.

Anyway, I think you get the idea.

If you wanted to simply stop plotting the circles, and put the letters
"right on" the spot, that would be easy as well.

Paul E. Johnson
Professor, Political Science
1541 Lilac Lane, Room 504
University of Kansas

More information about the R-help mailing list