ggplot 中 x 轴下方的表格

Sam*_*090 3 r ggplot2

大家好,我试图在 x 轴下方添加一些文本ggplot2,我能够使用geom_text和 的帮助来做到这一点coord_cartesian,但我无法使其可重现,因为这需要循环运行。我认为在表中添加我想要的行名称(第一,第二)的值可以解决这个问题,有人有这方面的经验吗?下面是我所做的解决方法。预先非常感谢您。


## Data

Grade <- 1 : 20 

Case <-  rep(paste('case' , 1:5,sep = ''),4)

Number <- paste('n', 1:20 ,  sep = '')

Class <- c(rep('Class1',5) , rep('Class2',5) , rep('Class3',5) , rep('Class4',5))

se <- 0.2

df <- data.frame(Grade,Case ,Number, Class  , se)


## plot 

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('') + 

  ylab('Case Num') + 

  theme_gray()+


  theme(plot.margin = unit(c(1,1,1,6), "lines"),
        axis.text.x = element_text(size = 15))  +

  scale_x_discrete(labels = paste(1:5 , '\n' ,  10:15,  sep = '')) + 

  geom_text(data = df[df$Class == 'Class1',],x = -1 , y = -3, 

            label= 'First\nSecond' , size = 4)+


  coord_cartesian(clip = "off" , xlim = c(1, 5) )

Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑:

抱歉造成混乱,虽然@stefan建议的解决方案非常方便,但主要目的是有这样的东西: 在此输入图像描述

考虑到建议的表将包含外部字符,而不是从数据框中获取(如果可能的话!)。

ste*_*fan 6

作为解决这个问题的另一种方法,我简单地将表设置为第二个 ggplot,我使用 与主要 ggplot 粘合在一起patchwork

## Data

Grade <- 1 : 20 
Case <-  rep(paste('case' , 1:5,sep = ''),4)
Number <- paste('n', 1:20 ,  sep = '')
Class <- c(rep('Class1',5) , rep('Class2',5) , rep('Class3',5) , rep('Class4',5))

se <- 0.2

df <- data.frame(Grade,Case ,Number, Class  , se)

library(patchwork)    
library(ggplot2)
library(tidyr)
library(dplyr)

## 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())

p2 <- 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") %>% 
  ggplot(aes(x = Case)) +
  geom_text(aes(y = factor(layer, c("Third", "Second", "First")), label = label)) +
  labs(y = "", x = NULL) +
  theme_minimal() +
  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)

p1 / p2 +  plot_layout(heights = c(8, 1))
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.3.0)创建于 2020-05-23

编辑geom_tile:通过添加 a并删除面之间的间距以及将 x 轴的扩展设置为零来调整以获得更像表格的输出:

p2 <- df %>%
  select(Case, Class) %>% 
  mutate(First = letters[1:nrow(.)],
         Second = LETTERS[1:nrow(.)],
         Third = as.character(1:nrow(.))) %>% 
  pivot_longer(c(First, Second, Third), names_to = "layer", values_to = "label") %>% 
  ggplot(aes(x = Case, y = factor(layer, c("Third", "Second", "First")))) +
  # Add Table Style
  geom_tile(fill = "blue", alpha = .4, color = "black") +
  geom_text(aes(label = label)) +
  # Remove expansion of axsis
  scale_x_discrete(expand = expansion(mult = c(0, 0))) +
  labs(y = "", x = NULL) +
  theme_minimal() +
  theme(axis.line = element_blank(), axis.ticks = element_blank(), axis.text.x = element_blank(),
        panel.grid = element_blank(), strip.text = element_blank(), panel.spacing.x = unit(0, "mm")) +
  facet_grid(~Class)

p1 / p2 +  plot_layout(heights = c(8, 1))
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.3.0)创建于 2020-05-24