Silchara
Silchara

Reputation: 35

Plot only one grob after gtable_filter

I am trying to select or resize the plot margins for this figure that I have created after I have filtered the labels, I am left with this white part that I would like to get rid of as shown on the image. enter image description here

Thank you

Below my reproducible code:

df=structure(list(Estimate = c(0.1784, 0.073, 0.0619, 0.1367, 0.1795, 
0.087), name = structure(c(1L, 6L, 5L, 4L, 3L, 2L), .Label = c("Intercept", 
"Doctor spouse", "8 years experience", "3 years experience", 
"1 year experience", "Female"), class = "factor"), group = structure(c(1L, 
2L, 3L, 3L, 3L, 4L), .Label = c("Intercept", "Male to", "0 Years Experience to", 
"No Spouse to"), class = "factor"), upper.95 = c(0.209, 0.0899, 
0.0858, 0.1606, 0.2034, 0.1077), lower.95 = c(0.1478, 0.0561, 
0.038, 0.1129, 0.1556, 0.0662), resp_type = c("Legislator", "Legislator", 
"Legislator", "Legislator", "Legislator", "Legislator")), row.names = c(NA, 
                                                                        -6L), class = c("tbl_df", "tbl", "data.frame"))

library(ggplot2)
library(tidyverse)
library(gridExtra)
library(gtable)

p1=df %>%
  filter(name!="Intercept") %>%
  ggplot(aes(x = name, y= Estimate*100))+
  geom_point(shape = 1)+
  geom_hline(yintercept = 0, lty = "longdash")+
  geom_errorbar(aes(ymax = upper.95*100, ymin = lower.95*100), width = 0.001)+
  coord_flip()+
  facet_grid(group ~.,scales = "free", space = "free", switch = "y")+
  theme(strip.placement = "outside",
        strip.text.y.left = element_text(face = "bold", angle=0, vjust = 1))+
  xlab("")



gg=ggplotGrob(p1)
plot_filtered2 <- gtable_filter(gg, 
                     "(background|panel|strip_l|axis-b|ylab-l|guide-box|title)", trim=TRUE)


grid.newpage()
grid.draw(plot_filtered2)

Upvotes: 1

Views: 129

Answers (2)

Allan Cameron
Allan Cameron

Reputation: 174586

The easiest way to do this from where you are (assuming you wish to keep all the elements you have selected from the gtable and for some reason don't want to get the same effect by simply using element_blank as Dan Adams suggests) is to set the widths of the first 6 columns of your gtable to 0 cm:

plot_filtered2$widths[1:6] <- unit(rep(0, 6), "cm")
grid.newpage()
grid.draw(plot_filtered2)

enter image description here

Upvotes: 1

Dan Adams
Dan Adams

Reputation: 5254

You can get this effect simply by omitting the elements of the plot you want to drop in the ggplot() call itself by specifying element_blank() within the theme() for each.

library(tidyverse)

df <- structure(list(Estimate = c(0.1784, 0.073, 0.0619, 0.1367, 0.1795, 0.087), name = structure(c(1L, 6L, 5L, 4L, 3L, 2L), .Label = c("Intercept", "Doctor spouse", "8 years experience", "3 years experience", "1 year experience", "Female"), class = "factor"), group = structure(c(1L, 2L, 3L, 3L, 3L, 4L), .Label = c("Intercept", "Male to", "0 Years Experience to", "No Spouse to"), class = "factor"), upper.95 = c(0.209, 0.0899, 0.0858, 0.1606, 0.2034, 0.1077), lower.95 = c(0.1478, 0.0561, 0.038, 0.1129, 0.1556, 0.0662), resp_type = c("Legislator", "Legislator", "Legislator", "Legislator", "Legislator", "Legislator")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))

df %>%
  filter(name != "Intercept") %>%
  ggplot(aes(x = name, y = Estimate * 100)) +
  geom_point(shape = 1) +
  geom_hline(yintercept = 0, lty = "longdash") +
  geom_errorbar(aes(ymax = upper.95 * 100, ymin = lower.95 * 100), width = 0.001) +
  coord_flip() +
  facet_grid(group ~ .,
             scales = "free",
             space = "free",
             switch = "y") +
  xlab(NULL) +
  theme(strip.text = element_blank(),
        strip.background = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank()
        )

Created on 2022-02-15 by the reprex package (v2.0.1)

Upvotes: 1

Related Questions