[R] Missing shapes in legend with scale_shape_manual

Kevin Zembower kev|n @end|ng |rom zembower@org
Tue Oct 31 19:29:52 CET 2023


Tim, thanks, it helps very much. It works like a charm.

Wow, there's so much I don't understand about ggplot2 functions,
especially the aes() function. I just discovered the ggplot2-book.org
site, and I hope to read it slowly and carefully over the next couple
of weeks.

Thanks again, Tim, for all your help.

-Kevin

On Tue, 2023-10-31 at 12:35 +0000, Howard, Tim G (DEC) wrote:
> I believe the missing shapes are because you had set alpha=0 for the
> last geom point. 
> 
> I expect there are better ways, but one way to handle it would be to
> avoid the filtering, adding columns with med and exercise status,
> like the following:
> 
> # setup with data provided
> Date <- c('2023-10-17', '2023-10-16', '2023-10-15', '2023-10-14',
>          '2023-10-13', '2023-10-12', '2023-10-11')
> Time <- c('08:50', '06:58', '09:17', '09:04', '08:44', '08:55',
> '07:55') 
> bg <- c(128, 144, 137, 115, 136, 122, 150)
> missed_meds <- c(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE)
> no_exercise <- c(FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE)
> 
> b2 <- data.frame(Date, Time, bg, missed_meds, no_exercise)
> 
> b2$Date <- as.Date(b2$Date)
> # add "status" columns, could also be defined as factor. 
> b2$medStat <- c("missed_meds",NA, NA, NA, NA, NA, "missed_meds")
> b2$exercise <- c(NA, NA, "missed_exercise",NA,"missed_exercise",
> "missed_exercise", "missed_exercise")
> 
> Then your ggplot call would be like this:
> 
> ggplot(data = b2, aes(x = Date, y = bg)) +
>   geom_line() +
>   geom_point(aes(shape = medStat), size = 3)+
>   geom_point(aes(shape = exercise),size = 3)+
>   scale_y_continuous(name = "Blood glucose (mg/dL)",
>                      breaks = seq(100, 230, by = 20)
>   ) +
>   geom_hline(yintercept = 130) +
>   scale_shape_manual(name = "Conditions",
>                      labels = c("Missed meds",
>                                 "Missed exercise"),
>                      values = c(20, 4)
>   )
> 
> 
> Note that this method then gets very close without the
> scale_shape_manual, too. 
> 
> Hope that helps. 
> Tim
> 
> 
> > Date: Mon, 30 Oct 2023 20:55:17 +0000
> > From: Kevin Zembower <kevin using zembower.org>
> > To: r-help using r-project.org <r-help using r-project.org>
> > Subject: [R] Missing shapes in legend with scale_shape_manual
> > Message-ID:
> >         <0100018b825e8f7f-646d2539-f8b5-4e1a-afc3-5d29f961967f-
> > 000000 using email.amazonses.com>
> > 
> > Content-Type: text/plain; charset="utf-8"
> > 
> > Hello,
> > 
> > I'm trying to plot a graph of blood glucose versus date. I also
> > record
> > conditions, such as missing the previous night's medications, and
> > missing
> > exercise on the previous day. My data looks like:
> > 
> > > b2[68:74,]
> > # A tibble: 7 × 5
> >   Date       Time      bg missed_meds no_exercise
> >   <date>     <time> <dbl> <lgl>       <lgl>
> > 1 2023-10-17 08:50    128 TRUE        FALSE
> > 2 2023-10-16 06:58    144 FALSE       FALSE
> > 3 2023-10-15 09:17    137 FALSE       TRUE
> > 4 2023-10-14 09:04    115 FALSE       FALSE
> > 5 2023-10-13 08:44    136 FALSE       TRUE
> > 6 2023-10-12 08:55    122 FALSE       TRUE
> > 7 2023-10-11 07:55    150 TRUE        TRUE
> > > 
> > 
> > This gets me most of the way to what I want:
> > 
> > ggplot(data = b2, aes(x = Date, y = bg)) +
> >     geom_line() +
> >     geom_point(data = filter(b2, missed_meds),
> >                shape = 20,
> >                size = 3) +
> >     geom_point(data = filter(b2, no_exercise),
> >                shape = 4,
> >                size = 3) +
> >     geom_point(aes(x = Date, y = bg, shape = missed_meds),
> >                alpha = 0) + #Invisible point layer for shape
> > mapping
> >     scale_y_continuous(name = "Blood glucose (mg/dL)",
> >                        breaks = seq(100, 230, by = 20)
> >                        ) +
> >     geom_hline(yintercept = 130) +
> >     scale_shape_manual(name = "Conditions",
> >                        labels = c("Missed meds",
> >                                   "Missed exercise"),
> >                        values = c(20, 4),
> >                        ## size = 3
> >                        )
> > 
> > However, the legend just prints an empty square in front of the
> > labels.
> > What I want is a filled circle (shape 20) in front of "Missed meds"
> > and a filled
> > circle (shape 4) in front of "Missed exercise."
> > 
> > My questions are:
> >  1. How can I fix my plot to show the shapes in the legend?
> >  2. Can my overall plotting method be improved? Would you do it
> > this way?
> > 
> > Thanks so much for your advice and guidance.
> > 
> > -Kevin
> > 
> > 
> > 
> > 





More information about the R-help mailing list