ggplot中x轴以下的表格

问题描述 投票:0回答:1

大家好,我是想在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) )

enter image description here

EDIT:

很抱歉让你感到困惑,虽然@stefan建议的解决方案非常方便,但主要目的是为了有这样的东西。enter image description here

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

r ggplot2
1个回答
1
投票

作为一个替代的方法来解决这个问题,我简单地设置了一个表作为第二个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))

创建于2020-05-23 重读包 (v0.3.0)

编辑: 调整,通过添加一个""来获得一个更像表格的输出。geom_tile 移除面与面之间的间距,并将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))

于2020-05-24创建。重读包 (v0.3.0)


0
投票

如果我对你的要求理解正确的话,(就像我上面的评论一样),这可能会帮助你。你只需要给你的图形命名,在循环中添加标签,然后在循环外渲染。

  ...
  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 = '')) +
  coord_cartesian(clip = "off" , xlim = c(1, 5) )

  label = NULL
  ordinal <- c('first','second','third','fourth','fifth','sixth','seventh','eighth','ninth','tenth')
for (i in 1:5) {

  label <- paste(label, '\n', ordinal[i])



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

          label= label , size = 4)

g1

这是我得到的结果。enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.