I have a plot I'm making in ggplot2 to summarize data that are from a 2 x 4 x 3 celled dataset. I have been able to make panels for the 2-leveled variable using facet_grid(. ~ Age) and to set the x and y axes using aes(x=4leveledVariable, y=DV). I used aes(group=3leveledvariable, lty=3leveledvariable) to produce the plot so far. This gives me a visualization that is paneled by the 2-leveled variable, with the X axis representing the 4 leveled variable and different lines plotted within the panels for the 3-leveled variable. But the key for the 3-leveled variable is titled with the 3-leveled variable's name and I want it to be a title that has a character space in it. How can I rename the title of the legend?

Things I've tried that don't seem to work (where abp is my ggplot2 object):

 abp <- abp + opts(legend.title="Town Name")
 abp <- abp + scale_fill_continuous("Town Name")
 abp <- abp + opts(group="Town Name")
 abp <- abp + opts(legend.title="Town Name")

Example data:

ex.data <- data.frame(DV=rnorm(2*4*3), V2=rep(1:2,each=4*3), V4=rep(1:4,each=3), V3=1:3)
  • 2
    $\begingroup$ @drknexus - if you can share your data, that would be helpful, or point to a similar dataset within R that has the same shape as your data. $\endgroup$
    – Chase
    Commented Nov 29, 2010 at 21:09
  • 1
    $\begingroup$ Everybody here seems very knowledgeable but I know for ggplot related questions I find their google group to be incredibly helpful. groups.google.com/group/ggplot2 $\endgroup$
    – Dason
    Commented Dec 6, 2010 at 19:48
  • $\begingroup$ Besides the well known and excellent documentation on Hadley's page, the not-so-known reference on Git Hub really helps with these kind of issues. $\endgroup$
    – hans0l0
    Commented Mar 6, 2011 at 23:17
  • $\begingroup$ Alternatively, theme_get() provides you with the same reference in the console. $\endgroup$ Commented Jun 20, 2011 at 4:55
  • 1
    $\begingroup$ In response to several flags asking for SO migration, it is actually impossible; see why on SO.meta: meta.stackexchange.com/q/8004/150510, meta.stackexchange.com/q/151890/150510. $\endgroup$
    – chl
    Commented May 12, 2013 at 20:00

2 Answers 2


Another option is to use

p + labs(aesthetic='custom text')     

For example, Chase's example would look like:


ex.data <- data.frame(DV=rnorm(2*4*3),V2=rep(1:2,each=4*3),V4=rep(1:4,each=3),V3=1:3)
p <- qplot(V4, DV, data=ex.data, geom="line", group=V3, linetype=factor(V3)) + facet_grid(. ~ V2)
p + labs(linetype='custom title')

and yield the figure: enter image description here

  • $\begingroup$ These days I'm prone to prefer using labs() to modify labels over specifying them on a scale/axis by scale/axis basis. $\endgroup$ Commented Oct 14, 2014 at 19:37

You can change the title of the legend by modifying the scale for that legend. Here's an example using the CO2 dataset


p <- qplot(conc, uptake, data = CO2, colour = Type) + scale_colour_discrete(name = "Fancy Title")
p <- p + facet_grid(. ~ Treatment)


Using the example data from above, here is a working solution. I think this mimics the plot that @drknexus is trying to create. As a side note, if anyone can explain why we have to treat V3 as a factor for it to be mapped to the legend, I'd appreciate it.

p <- qplot(V4, DV, data = ex.data, geom = "line", group = V3, lty = factor(V3)) 
p <- p + scale_linetype_discrete(name = "Fancy Title") + facet_grid(. ~ V2)

alt text

  • $\begingroup$ I think what I'm missing is a function like scale_color_discrete that ties into the "group" or "lty" specification in ggplot(data=ex.daata, aes(x=V4, y=DV, group=V3, lty=V3)) $\endgroup$ Commented Nov 29, 2010 at 21:31
  • 1
    $\begingroup$ Ah I found it: scale_linetype_discrete(name="bob") $\endgroup$ Commented Nov 29, 2010 at 21:35
  • $\begingroup$ @Chase: Edit with the scale_linetype_discrete bit and I'll accept your answer. $\endgroup$ Commented Nov 29, 2010 at 21:36
  • 1
    $\begingroup$ @drknexus - the issue with that is in my working example, the appropriate command is scale_colour_discrete() and the code you are working with is obviously a bit different. I don't know what that code is... $\endgroup$
    – Chase
    Commented Nov 29, 2010 at 22:09
  • 3
    $\begingroup$ @Chase Re: "why we have to treat V3 as a factor" scale_linetype_discrete expects a variable with discrete values (factor or character, from plyr::is.discrete), check out the src code on Github, j.mp/ejaRRT. Nice response (+1). $\endgroup$
    – chl
    Commented Nov 29, 2010 at 23:29

Not the answer you're looking for? Browse other questions tagged or ask your own question.