4

I have the following graph:

enter image description here

And would like to make what I thought would be a very simple change: I would like to remove the top, right and bottom sides of the left facet label border lines.

How do I do I remove those lines, or draw the equivalent of the right hand lines? I would rather not muck about with grobs, if possible, but won't say no to any solution that works.

Graph code:

library(ggplot2)
library(dplyr)
library(forcats)

posthoc1 %>% 
  mutate(ordering = -as.numeric(Dataset) + Test.stat,
         Species2 = fct_reorder(Species2, ordering, .desc = F)) %>% 
  ggplot(aes(x=Coef, y=Species2, reorder(Coef, Taxa), group=Species2, colour=Taxa)) + 
  geom_point(size=posthoc1$Test.stat*.25, show.legend = FALSE) + 
  ylab("") + 
  theme_classic(base_size = 20) +
  facet_grid(Taxa~Dataset, scales = "free_y", space = "free_y",  switch = "y") +
  geom_vline(xintercept = 0) +
  theme(axis.text.x=element_text(colour = "black"), 
        strip.placement = "outside", 
        strip.background.x=element_rect(color = NA,  fill=NA), 
        strip.background.y=element_rect(color = "black",  fill=NA)) +
  coord_cartesian(clip = "off") +
  scale_x_continuous(limits=NULL)

Data:

structure(list(Dataset = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 5L, 5L, 5L, 5L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L), .Label = c("All.habitat", "Aut.habitat", "Habitat.season", 
"Lit.season", "Spr.habitat"), class = "factor"), Species = structure(c(1L, 
2L, 3L, 5L, 6L, 10L, 11L, 12L, 13L, 1L, 3L, 5L, 6L, 13L, 1L, 
2L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 13L), .Label = c("Ar.sp1", 
"Ar.sp2", "Arc.sp1", "B.pus", "Dal.sp1.bumps", "Dip.unID", "I.palladium", 
"Pale", "Ph.sp3", "Port", "Somethus", "sty", "Sty.sp1"), class = "factor"), 
    Species2 = structure(c(2L, 9L, 1L, 4L, 5L, 7L, 11L, 12L, 
    13L, 2L, 1L, 4L, 5L, 13L, 2L, 9L, 4L, 5L, 6L, 10L, 8L, 7L, 
    11L, 13L), .Label = c("Arcitalitrus sp1", "Armadillidae sp1 ", 
    "Brachyiulus pusillus ", "Dalodesmidae sp1", "Diplopoda", 
    "Isocladosoma pallidulum ", "Ommatoiulus moreleti ", "Philosciidae sp2", 
    "Porcellionidae sp1", "Siphonotidae sp2", "Somethus sp1", 
    "Styloniscidae ", "Styloniscidae sp1"), class = "factor"), 
    Taxa = structure(c(3L, 3L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
    1L, 2L, 2L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 3L, 2L, 2L, 3L), .Label = c("Amphipoda", 
    "Diplopoda", "Isopoda"), class = "factor"), Variable = structure(c(2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Autumn", "Litter", 
    "Spring", "Summer"), class = "factor"), Coef = c(1.911502938, 
    2.086917154, 1.571872993, 12.61184801, 15.6161116, -1.430032837, 
    -12.51944478, 12.33934516, -8.040249562, 8.08258816, 1.780142396, 
    12.88982576, 16.78107544, -13.22641153, 1.68810887, 2.093965381, 
    12.27209197, 15.08328526, -6.334640911, -11.29985948, -11.62658947, 
    -1.676293808, -6.246555908, -3.470297147), SE = c(0.403497472, 
    2.21607562, 0.348600794, 2.423896379, 0.509468128, 3.423013791, 
    2.382857733, 1.775086895, 2.087788334, 2.23631504, 0.33402261, 
    2.518562443, 0.459720131, 1.950974996, 0.2476205, 0.235648095, 
    1.815155489, 0.325804415, 2.564680067, 2.437104984, 2.212583358, 
    2.677618401, 2.324019051, 0.420436743), Test.stat = c(18.36532749, 
    13.27324683, 13.29039037, 20.50277493, 44.06097153, 10.55234932, 
    14.64951518, 13.22575401, 20.16415411, 16.55627107, 11.81407568, 
    15.15213717, 40.67205188, 12.62233207, 37.60085488, 16.90879258, 
    20.20215107, 80.30520371, 13.35250626, 13.01692428, 17.52987519, 
    20.03658771, 12.02467914, 53.5052683)), row.names = 10:33, class = "data.frame")
Z.Lin
  • 28,055
  • 6
  • 54
  • 94
Grubbmeister
  • 857
  • 8
  • 25
  • I assume you are aware (since you used it in your code) the facet label borders are controlled by `element_rect()`, which controls all four sides at the same time. If you want only it on one side, hacking the grobs can work, though I'm not sure if that would actually improve this chart's appearance... – Z.Lin Feb 01 '19 at 02:25
  • Yes, I am aware. That was why I was finding it difficult. This graph is probably not the best example, but having a bar along the right side would make it clearer what group each set of species belonged to. – Grubbmeister Feb 01 '19 at 05:17

1 Answers1

8

This solution is based on grobs: find positions of "strip-l" (left strips) and then substitute the rect grobs with line grobs.

p <- posthoc1 %>% 
  mutate(ordering = -as.numeric(Dataset) + Test.stat,
         Species2 = fct_reorder(Species2, ordering, .desc = F)) %>% 
  ggplot(aes(x=Coef, y=Species2, reorder(Coef, Taxa), group=Species2, colour=Taxa)) + 
  geom_point(size=posthoc1$Test.stat*.25, show.legend = FALSE) + 
  ylab("") + 
  theme_classic(base_size = 20) +
  facet_grid(Taxa~Dataset, scales = "free_y", space = "free_y",  switch = "y") +
  geom_vline(xintercept = 0) +
  theme(axis.text.x=element_text(colour = "black"), 
        strip.placement = "outside", 
        #strip.background.x=element_rect(color = "white",  fill=NULL), 
        strip.background.y=element_rect(color = NA)
  ) +
  coord_cartesian(clip = "off") +
  scale_x_continuous(limits=NULL)

library(grid)
q <- ggplotGrob(p)
lg <- linesGrob(x=unit(c(0,0),"npc"), y=unit(c(0,1),"npc"), 
                   gp=gpar(col="red", lwd=4))

for (k in grep("strip-l",q$layout$name)) {
  q$grobs[[k]]$grobs[[1]]$children[[1]] <- lg
}

grid.draw(q)

enter image description here

Marco Sandri
  • 23,289
  • 7
  • 54
  • 58
  • 1
    Excellent, thank-you. I actually wanted the lines under the taxa names, so I changed the code to x=unit(c(1,1),"npc"), y=unit(c(1,0),"npc") – Grubbmeister Feb 02 '19 at 06:32
  • 1
    Marco Sandri's solution works wonders and is a great way to clarify graphs. II still struggle to fully understand the x and y inputs when switching axes etc. but a bit of trial-and-error usually does help. Just wondering if, building on this, it would be possible to omit one or two of the labels + lines, e.g. lets say I want to display all of them but the line for isopoda + the isopoda label...? Any idea? – Fred-LM Feb 04 '21 at 09:53
  • 1
    Woooow, well, this saved me, although I needed to change this to work with groupings along the x-axis instead (I used `"strip-b"` (bottom strips) instead of `"strip-l"` and changed the `x` and `y` in `linesGrob()` accordingly). I'm pretty sure there is no other way to do this. Bravo, @Marco Sandri! – Brunox13 Nov 07 '21 at 03:43