Evy
Evy

Reputation: 33

How to draw means and error bars on axes in ggplot2 R

I'd like to plot the means and error bars on the axes of my qplot in R. Here I provide an example of what I mean:

plot with means and error bars on the axes

As you can see on the axes in yellow are drawn means and error bars. I'd like to have that on my qplot.

Consider this subset of data:

x <- c(2.037820, 3.247560, 1.259053, 4.200520, 1.960179, 6.247880, 2.830693, 5.565390, 4.476610,
   4.627420, 2.500470, 4.156422, 2.855426, 9.210740, 2.663490, 4.412452, 3.270280, 2.838081,
   1.705650, 5.440690, 3.014000, 3.513820, 3.002930, 2.453080, 2.787320, 0.979227, 2.815368);

y <- c(2.855820, 3.332350, 1.991730, 3.688240, 3.565680, 3.525511, 4.451860, 3.233950, 6.125230,
   4.039360, 5.043330, 3.194650, 7.419020, 7.389600, 2.734740, 4.456250, 3.037665, 5.147140,
   3.184790, 3.595890, 5.457550, 1.527680, 2.848046, 1.418289, 3.996330, 4.516640, 2.884100);

fp <- qplot(x, y) + annotate("segment", x=-Inf, xend=Inf,y=-Inf, yend=Inf);
ggExtra::ggMarginal(fp, type = "density", margins = 'both')

It should give you a plot like this:

click here to see the plot

Now, how do I draw my means and error bars? the axes() used in the basic plots in R doesn't work in ggplot2.

I appreciate any suggestion, even if it requires to change packages or approach the problem differently.

Thank you!

Upvotes: 3

Views: 183

Answers (2)

NCliz
NCliz

Reputation: 9

You might have already solved it, but, just in case, here is the code for an error bar for each point, following Wietze314's contribution:

library(tidyverse)

example_DF <- tibble(x = c(2.037820, 3.247560, 1.259053, 4.200520, 1.960179, 6.247880, 2.830693, 5.565390, 4.476610,
                       4.627420, 2.500470, 4.156422, 2.855426, 9.210740, 2.663490, 4.412452, 3.270280, 2.838081,
                       1.705650, 5.440690, 3.014000, 3.513820, 3.002930, 2.453080, 2.787320, 0.979227, 2.815368),
                 y = c(2.855820, 3.332350, 1.991730, 3.688240, 3.565680, 3.525511, 4.451860, 3.233950, 6.125230,
                       4.039360, 5.043330, 3.194650, 7.419020, 7.389600, 2.734740, 4.456250, 3.037665, 5.147140,
                       3.184790, 3.595890, 5.457550, 1.527680, 2.848046, 1.418289, 3.996330, 4.516640, 2.884100))


dferrx <- example_DF %>%
  summarise(m = mean(x),
            lo = m - 1.96 * sd(x)/sqrt(n()),
            hi = m + 1.96 * sd(x)/sqrt(n()),
            x = m)

dferry <- example_DF %>%
  summarise(m = mean(y),
            lo = m - 1.96 * sd(y)/sqrt(n()),
            hi = m + 1.96 * sd(y)/sqrt(n()),
            y = m)


ggplot(example_DF, aes(x = x, y = y)) + 
  geom_point() +
  annotate("segment", x=-Inf, xend=Inf,y=-Inf, yend=Inf) +
  geom_errorbar(aes(ymin =y -dferry$lo, ymax = y+ dferry$hi))+
  geom_errorbarh(aes(xmin =x -dferrx$lo, xmax = x+ dferrx$hi))

enter image description here

It would benefit from a lot of esthetic tinkering, but there it is.

Upvotes: 0

Wietze314
Wietze314

Reputation: 6020

Maybe not exactly what you are looking for, but might be a startingpoint for you to continu working on:

require(ggplot2)
require(dplyr)

df <- data.frame(x = x, y = y)


dferrx <- df %>%
  summarise(m = mean(x),
            lo = m - 1.96 * sd(x)/sqrt(n()),
            hi = m + 1.96 * sd(x)/sqrt(n()),
            x = m)

dferry <- df %>%
  summarise(m = mean(y),
            lo = m - 1.96 * sd(y)/sqrt(n()),
            hi = m + 1.96 * sd(y)/sqrt(n()),
            y = m)


ggplot(df, aes(x = x, y = y)) + 
  geom_point() +
  annotate("segment", x=-Inf, xend=Inf,y=-Inf, yend=Inf) +
  geom_errorbar(data = dferry, aes(x = 0, ymin = lo, ymax = hi)) +
  geom_errorbarh(data = dferrx, aes(y = 0, xmin = lo, xmax = hi))

Upvotes: 3

Related Questions