Adding a legend to a (multi-facet) plot produced by ggplot().

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Adding a legend to a (multi-facet) plot produced by ggplot().

Rolf Turner

I have been struggling to add a legend as indicated in the subject line,
with no success at all.  I find the help to be completely bewildering.

I have attached the code of what I have tried in the context of a simple
reproducible example.

I have also attached a pdf file of a plot produced with base graphics to
illustrate roughly what I am after.

I would be grateful if someone could point me in the right direction.

cheers,

Rolf Turner

--
Honorary Research Fellow
Department of Statistics
University of Auckland
Phone: +64-9-373-7599 ext. 88276

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

reprex.txt (862 bytes) Download Attachment
whatIwant.pdf (8K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Adding a legend to a (multi-facet) plot produced by ggplot().

Jeffrey Pullin
Hi Rolf,

Some code to produce the plot you want is here:

https://gist.github.com/jeffreypullin/be752f11a136601ffecddc73ba0519b9

Hope you find it helpful.

Personally I have found that the key to effective ggplot2 use is getting
your data into the right format (one data.frame, tidy style) before you plot
it.

Cheers
Jeffrey

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: Adding a legend to a (multi-facet) plot produced by ggplot().

Rui Barradas
In reply to this post by Rolf Turner
Hello,

See if this is it. The standard trick is to reshape the data from wide
to long, see the SO post [1]. Then add a scale_shape_* layer to the plot.


yyy <- cbind(xxx, y3 = y3)
long <- reshape2::melt(yyy, id.vars = c("x", "y1", "grp"))

ggplot(long, aes(x, y = value, colour = variable, shape = variable)) +
   geom_line(aes(y = y1)) +
   geom_point() +
   scale_colour_manual("Doesn't work",values=c("blue","red"),
                       labels=c("clyde","irving")) +
   scale_shape_manual("Doesn't work",values=c(16,3),
                       labels=c("clyde","irving")) +

   facet_grid(cols=vars(grp))


[1]
https://stackoverflow.com/questions/2185252/reshaping-data-frame-from-wide-to-long-format

Hope this helps,

Rui Barradas

Às 00:04 de 01/12/19, Rolf Turner escreveu:

>
> I have been struggling to add a legend as indicated in the subject line,
> with no success at all.  I find the help to be completely bewildering.
>
> I have attached the code of what I have tried in the context of a simple
> reproducible example.
>
> I have also attached a pdf file of a plot produced with base graphics to
> illustrate roughly what I am after.
>
> I would be grateful if someone could point me in the right direction.
>
> cheers,
>
> Rolf Turner
>
>
> ______________________________________________
> [hidden email] mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: Adding a legend to a (multi-facet) plot produced by ggplot().

Antony Unwin
In reply to this post by Rolf Turner
How about defining your dataset differently, making the colouring property a variable?

xxx <- data.frame(x=rep(x, 4), y=c(y2, y3), grp=factor(rep(c("a","b"),each=20, times=2)), type=factor(rep(c("clyde", "irving"), each=40)))
ggplot(xxx, aes(x,y, colour=type, shape=type)) + geom_point() + geom_abline(intercept=3, slope=2) + facet_wrap(vars(grp)) + scale_colour_manual(values=c("blue", "red"))  + scale_shape_manual(values=c(20,3))

Then you could also plot the four groups separately if you wanted to:

ggplot(xxx, aes(x,y, colour=type, shape=type)) + geom_point() + geom_abline(intercept=3, slope=2) + facet_grid(rows=vars(type), cols=vars(grp)) + scale_colour_manual(values=c("blue", "red"))  + scale_shape_manual(values=c(20,3))

Antony Unwin
University of Augsburg,
Germany




> From: Rolf Turner <[hidden email]>
> Subject: [R] Adding a legend to a (multi-facet) plot produced by ggplot().
> Date: 1 December 2019 at 01:04:46 CET
> To: R help <[hidden email]>
>
>
>
> I have been struggling to add a legend as indicated in the subject line,
> with no success at all.  I find the help to be completely bewildering.
>
> I have attached the code of what I have tried in the context of a simple
> reproducible example.
>
> I have also attached a pdf file of a plot produced with base graphics to illustrate roughly what I am after.
>
> I would be grateful if someone could point me in the right direction.
>
> cheers,
>
> Rolf Turner
>
> --
> Honorary Research Fellow
> Department of Statistics
> University of Auckland
> Phone: +64-9-373-7599 ext. 88276
______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: Adding a legend to a (multi-facet) plot produced by ggplot().

Rolf Turner
In reply to this post by Rui Barradas

On 2/12/19 3:03 am, Rui Barradas wrote:

> Hello,
>
> See if this is it. The standard trick is to reshape the data from wide
> to long, see the SO post [1]. Then add a scale_shape_* layer to the plot.
>
>
> yyy <- cbind(xxx, y3 = y3)
> long <- reshape2::melt(yyy, id.vars = c("x", "y1", "grp"))
>
> ggplot(long, aes(x, y = value, colour = variable, shape = variable)) +
>    geom_line(aes(y = y1)) +
>    geom_point() +
>    scale_colour_manual("Doesn't work",values=c("blue","red"),
>                        labels=c("clyde","irving")) +
>    scale_shape_manual("Doesn't work",values=c(16,3),
>                        labels=c("clyde","irving")) +
>
>    facet_grid(cols=vars(grp))
>
>
> [1]
> https://stackoverflow.com/questions/2185252/reshaping-data-frame-from-wide-to-long-format 
>
>
> Hope this helps,

Almost there.  However the colour of the line changes with "values" and
lines show up in the legend.  I want the lines to be black in all
facets, and only points to show up in the legend.

I fiddled about a bit trying to achieve this but only succeeded in
messing things up completely.

Can you guide me a bit further, please?

cheers,

Rolf

--
Honorary Research Fellow
Department of Statistics
University of Auckland
Phone: +64-9-373-7599 ext. 88276

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: Adding a legend to a (multi-facet) plot produced by ggplot().

Rui Barradas
Hello,

Here are two ways of drawing the lines black and at the same time
removing the lines in the legend. The second way is more idiomatic.


1. Override the colour setting in the ggplot call when drawing the lines:

geom_line(aes(y = y1), colour = "black") +


2. Don't set the colour aesthetic in the initial ggplot call. It will be
needed only to draw the points, so set it in geom_point(). Though it
doesn't influence the lines' colour and the lines in the legend, the
same principle applies to shape = variable so I have moved it to
geom_point().

The complete instruction becomes:


ggplot(long, aes(x, y = value)) +
   geom_line(aes(y = y1)) +
   geom_point(aes(colour = variable, shape = variable)) +
   scale_colour_manual("Doesn't work",values=c("blue","red"),
                       labels=c("clyde","irving")) +
   scale_shape_manual("Doesn't work",values=c(16,3),
                      labels=c("clyde","irving")) +

   facet_grid(cols=vars(grp))



Hope this helps,

Rui Barradas


Às 01:07 de 02/12/19, Rolf Turner escreveu:

>
> On 2/12/19 3:03 am, Rui Barradas wrote:
>
>> Hello,
>>
>> See if this is it. The standard trick is to reshape the data from wide
>> to long, see the SO post [1]. Then add a scale_shape_* layer to the plot.
>>
>>
>> yyy <- cbind(xxx, y3 = y3)
>> long <- reshape2::melt(yyy, id.vars = c("x", "y1", "grp"))
>>
>> ggplot(long, aes(x, y = value, colour = variable, shape = variable)) +
>>    geom_line(aes(y = y1)) +
>>    geom_point() +
>>    scale_colour_manual("Doesn't work",values=c("blue","red"),
>>                        labels=c("clyde","irving")) +
>>    scale_shape_manual("Doesn't work",values=c(16,3),
>>                        labels=c("clyde","irving")) +
>>
>>    facet_grid(cols=vars(grp))
>>
>>
>> [1]
>> https://stackoverflow.com/questions/2185252/reshaping-data-frame-from-wide-to-long-format 
>>
>>
>> Hope this helps,
>
> Almost there.  However the colour of the line changes with "values" and
> lines show up in the legend.  I want the lines to be black in all
> facets, and only points to show up in the legend.
>
> I fiddled about a bit trying to achieve this but only succeeded in
> messing things up completely.
>
> Can you guide me a bit further, please?
>
> cheers,
>
> Rolf
>

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: Adding a legend to a (multi-facet) plot produced by ggplot().

Rolf Turner
On 2/12/19 5:08 pm, Rui Barradas wrote:

> Hello,
>
> Here are two ways of drawing the lines black and at the same time
> removing the lines in the legend. The second way is more idiomatic.
>
>
> 1. Override the colour setting in the ggplot call when drawing the lines:
>
> geom_line(aes(y = y1), colour = "black") +
>
>
> 2. Don't set the colour aesthetic in the initial ggplot call. It will be
> needed only to draw the points, so set it in geom_point(). Though it
> doesn't influence the lines' colour and the lines in the legend, the
> same principle applies to shape = variable so I have moved it to
> geom_point().
>
> The complete instruction becomes:
>
>
> ggplot(long, aes(x, y = value)) +
>    geom_line(aes(y = y1)) +
>    geom_point(aes(colour = variable, shape = variable)) +
>    scale_colour_manual("Doesn't work",values=c("blue","red"),
>                        labels=c("clyde","irving")) +
>    scale_shape_manual("Doesn't work",values=c(16,3),
>                       labels=c("clyde","irving")) +
>
>    facet_grid(cols=vars(grp))
>
>
>
> Hope this helps.

Boy did it *ever*!!!  Perfect. Thank you *HUGELY*!!!

cheers,

Rolf

--
Honorary Research Fellow
Department of Statistics
University of Auckland
Phone: +64-9-373-7599 ext. 88276

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.