Rollo99
Rollo99

Reputation: 1613

How to plot points with error bars per group in ggplot?

I have the following dataframe:


mlt = structure(list(V1 = c("Female > 55", "Male > 55", "Finance Industry", 
"South"), climatechange = c(0.116, 0.093, -0.186, 0.311), `SE climatechange` = c(0.299720594648884, 
0.209685397712576, 0.198822469025311, 0.220794746780239), housing = c(-0.223, 
0.288, -0.063, -0.401), `SE housing` = c(0.240842826106496, 0.262613125585529, 
0.233796203318591, 0.112279926339202), macro = c(-0.219, -0.243, 
0.252, 0.058), `SE macro` = c(0.167027449787956, 0.109527362813708, 
0.225740740488032, 0.139837005156927), `pension and savings` = c(0.287, 
0.815, 0.348, -0.611), `SE pension and savings` = c(0.278129111903788, 
0.26508680711124, 0.250889015745089, 0.0571662145564419)), row.names = c(NA, 
-4L), class = "data.frame")

View(df)

The dataframe has 4 topics and for each topic the corresponding standard error. So far, I plotted just the first topic:

mlt1 = mlt[,c(1:3)]

ggplot(mlt1, aes(V1, climatechange,
                 ymin = climatechange - 1.96*`SE climatechange`, ymax= climatechange + 1.96*`SE climatechange`)) +
  scale_x_discrete('') +
  scale_y_continuous('Marginal Effect \n',limits=c(-1,1)) +
  theme_classic() +
  theme(panel.border = element_rect(fill=NA)) + geom_errorbar(aes(x = V1, y = climatechange),
                                                              size=0.8,width=.2, col = "#0072B2") + 
  geom_point(aes(fill=factor(climatechange)), size=5, shape = 21) +
  scale_fill_manual(values=c(rep("#0072B2",13))) + 
  geom_hline(yintercept=0, col = "grey")  + theme(legend.position="none") + theme(axis.text = element_text(color = "black", size = 12),
                                                       axis.title = element_text(size = 12)) + labs(title="Climate Change") +
  theme(plot.title = element_text(color = "black", size = 12, face = "bold", hjust = 0.5)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 0.5, vjust = 0.5))

What I would like to do, though, is to get a graph that looks like this:

enter image description here

where instead of A,B,... I have my four topics and for each topic the corresponding variables displayed. Looking around, I saw that someone used: facet_grid(.~Test, space = "free_x", shrink = T, scales = "free_x"). Yet; I am not sure how to apply to my dataset.

Can anyone help me?

Thanks!

Upvotes: 0

Views: 1192

Answers (1)

Andy Baxter
Andy Baxter

Reputation: 7626

To do for all four - first you need to pivot a couple of times to make the dataframe tidy (i.e. create a column for measure (topic), mean and SE), then create the dataframe faceting by the measure variable:

mlt %>% 
  pivot_longer(2:9, 
               names_to = c("measure"), 
               values_to = "est") %>%
  mutate(stat = ifelse(str_detect(measure, "^SE"), "SE", "mean"),
         measure = str_extract(measure, "\\w*$")) %>% 
  pivot_wider(names_from = "stat",
              values_from = "est", 
              id_col = c(V1, measure)) %>% 
  ggplot(aes(x = V1, mean,
             ymin = mean - 1.96*SE,
             ymax = mean + 1.96*SE)) +
  scale_x_discrete('') +
  scale_y_continuous('Marginal Effect \n', 
                     # limits=c(-1,1)
  ) +
  coord_cartesian(ylim = c(-1, 1)) +
  theme_classic() +
  theme(panel.border = element_rect(fill=NA)) + 
  geom_errorbar(size=0.8,width=.2, col = "#0072B2") + 
  geom_point(size=5, shape = 21) +
  scale_fill_manual(values=c(rep("#0072B2",13))) + 
  geom_hline(yintercept=0, col = "grey")  + 
  theme(legend.position="none") + 
  theme(axis.text = element_text(color = "black", size = 12),
        axis.title = element_text(size = 12)) + labs(title="Climate Change") +
  theme(plot.title = element_text(color = "black", size = 12, face = "bold", hjust = 0.5)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 0.5, vjust = 0.5)) +
  facet_wrap(~measure, nrow = 1)

enter image description here

Upvotes: 2

Related Questions