Removing inside lines in multiple factor R plot

27 Views Asked by At

I am representing four categorical factors at three levels for a response variable. However, when I try to set up a border it creates a border for each factor, and I don´t know how to remove those veritcal lines.

enter image description here

Here is a MWE:

library(ggplot2)
library("scales")
library(ggpubr)
library(car)
library(tidyverse)
scenedesmus$Milling<-as.character(scenedesmus$Milling)
scenedesmus$Temperature<-factor(scenedesmus$Temperature)
scenedesmus$Time<-factor(scenedesmus$Time)
scenedesmus$Ratio<-factor(scenedesmus$Ratio)


dput(scenedesmus)
structure(list(Temperature = c(20, 20, 20, 20, 20, 20, 30, 30, 
30, 30, 30, 30, 40, 40, 40, 40, 40, 40), Time = c(0.5, 0.5, 1, 
1, 2, 2, 0.5, 0.5, 1, 1, 2, 2, 0.5, 0.5, 1, 1, 2, 2), Ratio = c(3, 
3, 6, 6, 12, 12, 6, 6, 12, 12, 3, 3, 12, 12, 3, 3, 6, 6), Milling = structure(c(1L, 
1L, 2L, 2L, 3L, 3L, 3L, 3L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 1L, 
1L), levels = c("None", "Mortar", "Discs"), class = "factor"), 
    PRY = c(7.10618979550317, 6.99107348052751, 9.81654489395678, 
    10.0937678454159, 15.8872899104855, 16.5147395153748, 15.6085073784574, 
    15.8904572330355, 9.85155639002801, 10.3291566375677, 9.81557388225615, 
    10.1774212169006, 12.0972576247432, 11.1350551614397, 14.7591913822601, 
    14.8846506719242, 9.47697977090569, 10.8328555963545), CRY = c(12.9913707456184, 
    13.2037056981015, 14.6223886369729, 14.4156689100426, 20.8510599220091, 
    21.1334682925674, 20.7517385553227, 20.3784601114164, 13.1903022986714, 
    12.7481614338955, 14.3799945987187, 15.1548695641213, 16.3653561008515, 
    17.3492383422838, 22.4414097199122, 22.4340213280367, 14.0895227253865, 
    16.0388931794408), PCR = c(0.546993072143667, 0.529478135939726, 
    0.671336615218633, 0.700194205929921, 0.761941597689038, 
    0.781449560798454, 0.752154203217537, 0.779767320305684, 
    0.746878742196859, 0.810246770966047, 0.682585366418063, 
    0.671561122571146, 0.739199168670324, 0.641818098394623, 
    0.657676659642481, 0.663485625438106, 0.672626032522028, 
    0.675411668071984)), row.names = c(NA, -18L), class = c("tbl_df", 
"tbl", "data.frame"))


scenedesmus %>%
  mutate(across(Temperature:Milling, as.character)) %>%
  pivot_longer(Temperature:Milling) %>%
  mutate(value = factor(value, levels(factor(value))[
    c(12:10, 6, 9, 3, 5, 7:8, 1:2, 4)])) %>%
  ggplot(aes(value, PCR, group = name, color = name)) +
  geom_point(stat = 'summary', fun = mean, size=3) +
  geom_hline(yintercept = mean(scenedesmus$PCR, na.rm=TRUE),linetype='dotted', col = 'grey', size=1.5)+
  scale_y_continuous(limits = c(0.5, 0.9)) +
  geom_line(stat = 'summary', fun = mean, size=1) +
  facet_grid(~name, scales = 'free_x', switch = 'x') +
  scale_color_manual(values = c("#0072B2", "#D55E00", "#CC79A7","#009E73")) +
  coord_cartesian(clip = 'off') +
  geom_vline(data = data.frame(a = 0.4, name = 'Milling'),
             aes(xintercept = a)) +
  theme_classic(base_size = 20) +
  theme(strip.placement = 'outside',
        legend.position="none",
        strip.background = element_blank(),
        axis.title.x = element_blank(),
        panel.grid.major=element_blank(),
        panel.grid.minor=element_blank(),
        panel.background = element_rect(color="black"),
        panel.spacing.x = unit(0, 'mm'),
        axis.ticks = element_line(),
        axis.line.x = element_line(),
        axis.title.y = element_text(size=20, face="bold"),
        strip.text = element_text(face = "bold")) +
  labs(y = "response")


Removing panel.background = element_rect(color="black") I obtained a plot but with the right and top borders missing

enter image description here

1

There are 1 best solutions below

0
stefan On BEST ANSWER

The issue is that panel.background will draw an outline around each panel. Instead, one option would be to fake your right and top border lines using geom_h/vline, i.e. add a geom_hline to each panel for which you set yintercept=Inf and a geom_vline for the rightmost panel.

library(scales)
library(car)
library(tidyverse)

scenedesmus %>%
  mutate(across(Temperature:Milling, as.character)) %>%
  pivot_longer(Temperature:Milling) %>%
  mutate(value = factor(value, levels(factor(value))[
    c(12:10, 6, 9, 3, 5, 7:8, 1:2, 4)
  ])) %>%
  ggplot(aes(value, PCR, group = name, color = name)) +
  geom_point(stat = "summary", fun = mean, size = 3) +
  geom_hline(yintercept = mean(scenedesmus$PCR, na.rm = TRUE), linetype = "dotted", col = "grey", size = 1.5) +
  geom_hline(
    yintercept = Inf, linewidth = 1
  ) +
  geom_vline(
    data = data.frame(x = Inf, name = "Time"),
    aes(xintercept = x), linewidth = 1
  ) +
  scale_y_continuous(limits = c(0.5, 0.9)) +
  geom_line(stat = "summary", fun = mean, size = 1) +
  facet_grid(~name, scales = "free_x", switch = "x") +
  scale_color_manual(values = c("#0072B2", "#D55E00", "#CC79A7", "#009E73")) +
  coord_cartesian(clip = "off") +
  geom_vline(
    data = data.frame(a = 0.4, name = "Milling"),
    aes(xintercept = a)
  ) +
  theme_classic(base_size = 20) +
  theme(
    strip.placement = "outside",
    legend.position = "none",
    strip.background = element_blank(),
    axis.title.x = element_blank(),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.spacing.x = unit(0, "mm"),
    axis.ticks = element_line(),
    axis.line.x = element_line(),
    axis.title.y = element_text(size = 20, face = "bold"),
    strip.text = element_text(face = "bold")
  ) +
  labs(y = "response")

enter image description here