rm(list = ls())
###############################input data 
## Data

Grade <- 1 : 10 
Case <-  rep(paste('case' , 1:5,sep = ''), 2)
Number <- paste('n', 1:10 ,  sep = '')
Class <- c(rep('Class1',5) , rep('Class2',5))
se <- 0.2
df <- data.frame(Grade,Case ,Number, Class  , se)
df
##    Grade  Case Number  Class  se
## 1      1 case1     n1 Class1 0.2
## 2      2 case2     n2 Class1 0.2
## 3      3 case3     n3 Class1 0.2
## 4      4 case4     n4 Class1 0.2
## 5      5 case5     n5 Class1 0.2
## 6      6 case1     n6 Class2 0.2
## 7      7 case2     n7 Class2 0.2
## 8      8 case3     n8 Class2 0.2
## 9      9 case4     n9 Class2 0.2
## 10    10 case5    n10 Class2 0.2
library(patchwork)    
## Warning: 程辑包'patchwork'是用R版本4.2.2 来建造的
library(ggplot2)
## Warning: 程辑包'ggplot2'是用R版本4.2.3 来建造的
library(tidyr)
library(dplyr)
## 
## 载入程辑包:'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## plot 

p1 <- ggplot(df, aes(x= factor(Case , levels =c('case1','case2' , 'case3' , 'case4','case5')) , y=Grade ,
                     fill= Grade)) + 
  geom_bar(position="dodge", stat="identity",
           colour="black",
           size=.4) +    
  geom_errorbar(aes(ymin=Grade +se, ymax=Grade +se),
                size=.3,    
                width=.2,
                position=position_dodge(.9))+
  geom_linerange(aes(ymin = Grade , ymax = Grade +se),position=position_dodge(.9))+
  geom_text(aes(label=Number , y = Grade  + se + 1),data=df, position=position_dodge(0.9), size= 4) +
  ggtitle('Place a table below x axis')+
  facet_grid(~Class) + 
  xlab(NULL) + 
  ylab('Case Num') + 
  theme_gray()+
  theme(axis.text.x = element_blank())
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## i Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
p1 

p1 <- p1 +theme(legend.position = "top",
                #legend.direction = "vertical",
                legend.spacing.x = unit(0.1, 'cm'),
                #legend.spacing.y = unit(0.2, 'cm'),
                legend.title.align = 0.1,
                legend.key.size = unit(.3, "cm"),
                legend.text = element_text(colour="black", size=10, 
                                           face="plain"),
                legend.title = element_text(colour="black", size=10, 
                                            face="plain"),
                legend.background = element_blank(),
                legend.key = element_rect(colour = NA, fill = NA),
                #legend.key.height=unit(0.5,"line"),
                #legend.key.width=unit(0.7,"line"),
                #legend.margin=margin(5,5,5,5),
                legend.justification = c(0.5, 0.7),
                legend.box.margin=margin(0,0,0,0),
                panel.background = element_blank(),
                panel.border = element_rect(colour = NA, fill=NA, size=1),
                axis.line = element_line(size = 0.5, color = "black"),
                panel.grid = element_blank(),
                axis.text.x   = element_blank(),
                axis.text.y   = element_text(size= 12, color = "black",family = "sans",vjust = 0.5,hjust = 0.5),
                axis.title  = element_text(size=12, color = "black",family = "sans"),
                axis.ticks =  element_line(size= 0.5),
                axis.ticks.length = unit(3, "pt"))  +
  scale_y_continuous(expand = c(0,0), limits = c(0, 12))
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## i Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The `size` argument of `element_rect()` is deprecated as of ggplot2 3.4.0.
## i Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
p1 

df_table <- df %>% 
  mutate(First = as.integer(stringr::str_extract(Case, "\\d")),
         Second = First + 9,
         Third = Second + 9) %>% 
  pivot_longer(c(First, Second, Third), names_to = "layer", values_to = "label") 

df_table
## # A tibble: 30 x 7
##    Grade Case  Number Class     se layer  label
##    <int> <chr> <chr>  <chr>  <dbl> <chr>  <dbl>
##  1     1 case1 n1     Class1   0.2 First      1
##  2     1 case1 n1     Class1   0.2 Second    10
##  3     1 case1 n1     Class1   0.2 Third     19
##  4     2 case2 n2     Class1   0.2 First      2
##  5     2 case2 n2     Class1   0.2 Second    11
##  6     2 case2 n2     Class1   0.2 Third     20
##  7     3 case3 n3     Class1   0.2 First      3
##  8     3 case3 n3     Class1   0.2 Second    12
##  9     3 case3 n3     Class1   0.2 Third     21
## 10     4 case4 n4     Class1   0.2 First      4
## # i 20 more rows
head(df_table)
## # A tibble: 6 x 7
##   Grade Case  Number Class     se layer  label
##   <int> <chr> <chr>  <chr>  <dbl> <chr>  <dbl>
## 1     1 case1 n1     Class1   0.2 First      1
## 2     1 case1 n1     Class1   0.2 Second    10
## 3     1 case1 n1     Class1   0.2 Third     19
## 4     2 case2 n2     Class1   0.2 First      2
## 5     2 case2 n2     Class1   0.2 Second    11
## 6     2 case2 n2     Class1   0.2 Third     20
p2 <- ggplot(df_table, aes(x = Case)) +
  geom_text(aes(y = factor(layer, c("Third", "Second", "First")), label = label)) +
  
  labs(y = "", x = NULL) + 
  #scale_y_discrete(expand = c(0.1,0)) +
  theme(axis.text.x = element_blank(), 
        axis.title = element_blank(), 
        axis.ticks = element_blank(),
        panel.background = element_blank(),
        axis.text.y   = element_text(size= 12, color = "black",family = "sans",vjust = 0.5,hjust = 0.5),
        panel.border = element_rect(colour = NA, fill=NA, size=1),
        axis.line = element_line(size = 0, color = "white"), 
        axis.ticks.length.y = unit(1, "mm"),
        plot.margin = unit(c(0,0,0,0), "cm")) +
  theme(axis.line = element_blank(), axis.ticks = element_blank(), axis.text.x = element_blank(),
        panel.grid = element_blank(), strip.text = element_blank()) +
  facet_grid(~Class) 
p2

p3 <- p2 + annotate("rect", xmin = -Inf, xmax = Inf, ymin = 0.5, ymax =1.5, 
                    fill = c("yellow"), alpha = 0.3) +
  annotate("rect", xmin = -Inf, xmax = Inf, ymin = 1.5, ymax = 2.5, 
           fill = c("green"), alpha = 0.3) +
  annotate("rect", xmin = -Inf, xmax = Inf, ymin = 2.5, ymax = 3.5, 
           fill = c("blue"), alpha = 0.3) 


p3

p1 / p3 +  plot_layout(heights = c(8, 1))

###################################################
ggsave(paste0(Sys.Date(),"-model_3.tiff"), 
       plot = last_plot(), device = NULL, 
       #path = dir_path,
       scale = 1, width = 15, height = 20, units ="cm",dpi = 300, 
       limitsize = TRUE,compression = "lzw")

#setwd("C:\\Users\\liyix\\OneDrive\\Desktop\\")

#https://stackoverflow.com/questions/61977439/table-below-x-axis-in-ggplot