tzu
tzu

Reputation: 183

How to Add Extra Labels on y-axis without Data in ggplot2

I am making a plot showing two sets of regression coefficients and standard errors and the graph is as follow:

Coef Plot

What I want to do further is to add extra variables without any data on the y-axis. For instance, put a label FeatGender on top of the label FeatGenderMale, or for another example, put a label FeatEU in between the label of FeatPartyIDLiberal Democrats and the label of FeatEUIntegrationSupportEUIntegration. Below is the reduced version of data:

          coef         se          low         high    sex
1  -0.038848364 0.02104994 -0.080106243  0.002409514 Female
2   0.095831201 0.02793333  0.041081877  0.150580526 Female
3   0.050972670 0.02828353 -0.004463052  0.106408391 Female
4  -0.183558492 0.02454943 -0.231675377 -0.135441606 Female
5   0.044879447 0.02712518 -0.008285914  0.098044808 Female
6 -0.003858672 0.03005477 -0.062766024  0.055048681   Male
7  0.003048763 0.04687573 -0.088827676  0.094925203   Male
8  0.015343897 0.03948959 -0.062055700  0.092743494   Male
9 -0.132600259 0.04146323 -0.213868197 -0.051332322   Male
10 -0.029764559 0.04600719 -0.119938650  0.060409533   Male

Here are my codes:

v_name <- c("FeatGenderMale", "FeatPartyIDLabourParty", "FeatPartyIDLiberalDemocrats", 
            "FeatEUIntegrationOpposeEUIntegration", "FeatEUIntegrationSupportEUIntegration")

t <- ggplot(temp, aes(x=c(v_name,v_name), y=coef, group=sex, colour=sex))

t + 
  geom_point(position = position_dodge(width = 0.3)) + 
  geom_errorbar(aes(ymin = low, ymax = high, width = 0), position = position_dodge(0.3)) + 
  coord_flip() + 
  scale_x_discrete(limits = rev(v_name)) + 
  geom_hline(yintercept = 0.0, linetype = "dotted") + 
  theme(legend.position = "bottom")

Thanks for the help!

Upvotes: 1

Views: 257

Answers (1)

Jon Spring
Jon Spring

Reputation: 66570

Here's an approach that first applies the v_name into the source data frame, but then uses a longer appended version of the v_name vector for the axis.

library(ggplot2); library(dplyr)
# Add the v_name into the table
temp2 <- temp %>% group_by(sex) %>% mutate(v_name = v_name) %>% ungroup() 

# Make the dummy label for axis with add'l entries
v_name2 <- append(v_name, "FeatGender", after = 0)
v_name2 <- append(v_name2, "FeatEU", after = 4)

# Plot using the new table
t <- ggplot(temp2, aes(x=v_name, y=coef, group=sex, colour=sex))
t + 
  geom_point(position = position_dodge(width = 0.3)) + 
  geom_errorbar(aes(ymin = low, ymax = high, width = 0), position = position_dodge(0.3)) + 
  coord_flip() + 
  # ... but use the larger list of axis names
  scale_x_discrete(limits = rev(v_name2)) + 
  geom_hline(yintercept = 0.0, linetype = "dotted") + 
  theme(legend.position = "bottom")

enter image description here

Upvotes: 2

Related Questions