[R] How to add error bars to a line plot with ggplot2?
Luigi Marongiu
m@rong|u@|u|g| @end|ng |rom gm@||@com
Fri Jul 14 22:34:39 CEST 2023
Thank you, the problem was indeed about factors.
Case solved
On Fri, Jul 14, 2023 at 7:05 PM Rui Barradas <ruipbarradas using sapo.pt> wrote:
>
> Às 17:33 de 14/07/2023, Luigi Marongiu escreveu:
> > Hello,
> > I am measuring a certain variable at given time intervals and
> > different concentrations of a reagent. I would like to make a scatter
> > plot of the values, joined by a line to highlight the temporal
> > measure.
> > I can plot this all right. Now, since I have more than one replicate,
> > I would like to add he error bars.
> > I prepared a dataframe with the mean measures and a column with the
> > standard deviations, but when I run the code, I get the error:
> > ```
> > Error in `check_aesthetics()`:
> > ! Aesthetics must be either length 1 or the same as the data (20): colour
> > Run `rlang::last_trace()` to see where the error occurred.
> > ```
> > I am missing something, but what?
> > Thank you
> >
> >
> > WORKING EXAMPLE
> > ```
> > measTime = c(1 ,2 ,4 ,24 ,48 ,1 ,2 ,4 ,24
> > ,48 ,1 ,2 ,4 ,24 ,48 ,1 ,2 ,4 ,24 ,48)
> > conc = c(0.25 ,0.25 ,0.25 ,0.25 ,0.25 ,1.12 ,1.12
> > ,1.12 ,1.12 ,1.12 ,2.5 ,2.5 ,2.5 ,2.5 ,2.5
> > ,25 ,25 ,25 ,25 ,25)
> > varbl = c(0.0329999999999999 ,0.27 ,0.0785 ,0.1015
> > ,-0.193 ,0.048 ,0.113 ,0.1695 ,-0.775 ,0.464 ,-0.257
> > ,-0.154 ,-0.3835 ,-1.23 ,-0.513 ,1.3465 ,1.276
> > ,1.128 ,-2.56 ,-1.813)
> > stdDev =c(0.646632301492381 ,0 ,1.77997087991162
> > ,0.247683265482349 ,0 ,0.282901631902917 ,0
> > ,0.273086677326693 ,1.03807578400295 ,0 ,0.912213425319609
> > ,0 ,1.64371621638287 ,2.23203614068709 ,0 ,0.2615396719429
> > ,0 ,0.54039985196149 ,2.15236180353893 ,0)
> > df = data.frame(Time=measTime, mM=conc, ddC=varbl, SD=stdDev)
> > library(ggplot2)
> > COLS = c("green", "red", "blue", "yellow")
> > ggplot(df,
> > aes(x=Time, y=ddC, colour=mM, group=mM)) +
> > geom_line(aes(x=Time, y=ddC, colour=mM, group=mM)) +
> > geom_errorbar(aes(x=Time, ymin=ddC-SD, ymax=ddC+SD, colour=mM, group=mM),
> > width=.1, colour=COLS) +
> > geom_point(size=6) +
> > scale_colour_manual(values = COLS) +
> > ggtitle("Exposure") +
> > xlab(expression(bold("Time (h)"))) +
> > ylab(expression(bold("Value"))) +
> > geom_hline(aes(yintercept=0)) +
> > theme_classic()
> > ```
> >
> > ______________________________________________
> > R-help using r-project.org 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.
> Hello,
>
> Two notes:
>
> 1. If you want to use a discrete colours vector, your 'colour' aesthetic
> must be mapped to a discrete variabe. The most frequent cases are
> character or factor columns.
>
> 2. If you start the plot with certain aesthetics set you don't have to
> repeat them in subsequent layers, geom_line can be called with no aes()
> and gem_errorbar doesn't need x=measTime again.
>
>
> As for the main error, the colors vector COLS should be removed from
> geom_errorbar.
>
>
>
> df <- data.frame(Time = measTime,
> mM = factor(conc), # this must be a factor
> ddC = varbl,
> SD = stdDev)
>
> library(ggplot2)
>
> COLS = c("green", "red", "blue", "yellow")
>
> ggplot(df, aes(x = Time, y = ddC, colour = mM, group = mM)) +
> geom_line() +
> geom_errorbar(aes(ymin = ddC - SD, ymax = ddC + SD), width = 0.1) +
> geom_point(size = 6) +
> geom_hline(aes(yintercept = 0)) +
> scale_colour_manual(values = COLS) +
> ggtitle("Exposure") +
> xlab(expression(bold("Time (h)"))) +
> ylab(expression(bold("Value"))) +
> theme_classic()
>
>
> Hope this helps,
>
> Rui Barradas
>
--
Best regards,
Luigi
More information about the R-help
mailing list