ggplot:如何使用 facet_grid 创建不同的 x 轴标题

Posted

技术标签:

【中文标题】ggplot:如何使用 facet_grid 创建不同的 x 轴标题【英文标题】:ggplot: How to create different x-axis titles with facet_grid 【发布时间】:2018-08-12 01:18:08 【问题描述】:

我有两个共享 y 轴但具有不同 x 轴的图。我使用 facet_grid 将它们适当地分开(见图),但是两个 x 轴需要有不同的标题(而不是一个标题“Num Cell Lines.Tissue”)。我已经看到通过首先创建 2 个 ggplot 对象然后使用 ggplotGrob 之类的函数来完成类似的操作。有没有办法直接做到这一点?

编辑 1: 包含数据、代码

数据:

Variable  Condition  Num.CellLines.Tissue   Percent.Altered
V1        C1                 1              0.20149254
V1        C1                 2              0.03731343
V1        C1                 3              0
V1        C1                 4              0
V1        C1                 5              0
V2        C2                 1              0.74893617
V2        C2                 2              0.37446809
V2        C2                 3              0.16595745
V2        C2                 4              0.09787234
V2        C2                 5              0.06808511
V2        C2                 6              0.05531915
V2        C2                 7              0.02553191
V2        C2                 8              0.01702128
V2        C2                 9              0.01276596
V2        C2                10              0.00851064
V2        C3                 1              0.88554217
V2        C3                 2              0.68072289
V2        C3                 3              0.40361446
V2        C3                 4              0.22289157
V2        C3                 5              0.11445783
V2        C3                 6              0.06626506
V2        C3                 7              0.04819277
V2        C3                 8              0.01807229
V2        C3                 9              0.01807229
V2        C3                10              0.01204819
V2        C4                 1              0.87301587
V2        C4                 2              0.6984127
V2        C4                 3              0.52380952
V2        C4                 4              0.38095238
V2        C4                 5              0.25925926
V2        C4                 6              0.14285714
V2        C4                 7              0.07407407
V2        C4                 8              0.04232804
V2        C4                 9              0.03703704
V2        C4                10              0.03174603

代码:

ggplot(data, aes(y=Percent.Altered, x = Num.CellLines.Tissue, color= Condition )) + geom_line(size=1) + facet_grid(. ~ Variable, scales="free_x")

编辑2:理想情节的图像

标签 V1 和 V2 以我希望它们默认的方式显示,它们与它们下面的 x 轴的标题应该是不同的。

【问题讨论】:

我们可以看到您使用dput绘制数据和数据本身的代码吗? 隐藏 x 轴并改用分面标签怎么样? @tyluRp 添加数据和代码 【参考方案1】:

我们可以使用switch = 'x' 然后放置strip.placement = "outside"

library(tidyverse)

text = "Variable  Condition  Num.CellLines.Tissue   Percent.Altered
V1        C1                 1              0.20149254
V1        C1                 2              0.03731343
V1        C1                 3              0
V1        C1                 4              0
V1        C1                 5              0
V2        C2                 1              0.74893617
V2        C2                 2              0.37446809
V2        C2                 3              0.16595745
V2        C2                 4              0.09787234
V2        C2                 5              0.06808511
V2        C2                 6              0.05531915
V2        C2                 7              0.02553191
V2        C2                 8              0.01702128
V2        C2                 9              0.01276596
V2        C2                10              0.00851064
V2        C3                 1              0.88554217
V2        C3                 2              0.68072289
V2        C3                 3              0.40361446
V2        C3                 4              0.22289157
V2        C3                 5              0.11445783
V2        C3                 6              0.06626506
V2        C3                 7              0.04819277
V2        C3                 8              0.01807229
V2        C3                 9              0.01807229
V2        C3                10              0.01204819
V2        C4                 1              0.87301587
V2        C4                 2              0.6984127
V2        C4                 3              0.52380952
V2        C4                 4              0.38095238
V2        C4                 5              0.25925926
V2        C4                 6              0.14285714
V2        C4                 7              0.07407407
V2        C4                 8              0.04232804
V2        C4                 9              0.03703704
V2        C4                10              0.03174603"

data <- read.table(text = text, header = TRUE)
head(data)
#>   Variable Condition Num.CellLines.Tissue Percent.Altered
#> 1       V1        C1                    1      0.20149254
#> 2       V1        C1                    2      0.03731343
#> 3       V1        C1                    3      0.00000000
#> 4       V1        C1                    4      0.00000000
#> 5       V1        C1                    5      0.00000000
#> 6       V2        C2                    1      0.74893617

ggplot(data, aes(y = Percent.Altered, x = Num.CellLines.Tissue, color = Condition )) + 
  geom_line(size = 1) + facet_grid(. ~ Variable, scales = "free_x", switch = 'x') +
  theme_classic(base_size = 16) +
  theme(strip.placement = "outside") +
  theme(axis.title.x = element_blank(),
        strip.background = element_blank())

# Append the original x-axis label. Code taken from the ref below 
# http://ggplot2.tidyverse.org/reference/as_labeller.html
appender <- function(string, prefix = "Num.CellLines.Tissue: ") paste0(prefix, string)
ggplot(data, aes(y = Percent.Altered, x = Num.CellLines.Tissue, color = Condition )) + 
  geom_line(size = 1) + 
  facet_grid(. ~ Variable, 
             labeller = as_labeller(appender),
             scales = "free_x", switch = 'x') +
  theme_classic(base_size = 16) +
  theme(strip.placement = "outside") +
  theme(axis.title.x = element_blank(),
        strip.background = element_blank())  

根据OP的新图编辑,我们需要分别绘制V1V2然后使用cowplot::plot_grid函数合并在一起:

# V1
p1 <- ggplot(data %>% filter(Variable == "V1"), 
             aes(y = Percent.Altered, x = Num.CellLines.Tissue, color = Condition )) + 
  geom_line(size = 1) + 
  facet_grid(. ~ Variable, scales = "free_x") +
  scale_y_continuous(limits = c(0, 1), expand = c(0, 0)) +
  theme_classic(base_size = 16) +
  theme(
    legend.position = "none", 
    plot.margin = unit(c(0, 0, 0, 0), "cm")) +
  scale_color_brewer(palette = "Set1") +
  xlab("# Tissues")

# V2
p2 <- ggplot(data %>% filter(Variable == "V2"), 
             aes(y = Percent.Altered, x = Num.CellLines.Tissue, color = Condition )) + 
  geom_line(size = 1) + 
  facet_grid(. ~ Variable, scales = "free_x") +
  scale_y_continuous(limits = c(0, 1), expand = c(0, 0)) +
  theme_classic(base_size = 16) +
  theme(
    legend.position = "none", 
    plot.margin = unit(c(0, 0, 0, 0), "cm")) +
  scale_color_brewer(palette = "Dark2") +
  xlab("# Cell Lines") + ylab("")

# Remove the y-axis for the 2nd plot - p2 then merge 2 plots
cowplot::plot_grid(p1, 
                   p2 + 
                     theme(axis.text.y = element_blank(),
                           axis.line.y = element_blank(),
                           axis.title.y= element_blank(),
                           axis.ticks.y= element_blank()),
                   nrow = 1,
                   rel_widths = c(1.2, 1),
                   align = 'h', axis = 'tb')

由reprex package (v0.2.0) 于 2018 年 3 月 4 日创建。

【讨论】:

我很困惑为什么(或是否)OP 想要这个? V1 和 V2 不代表 x 轴上的刻度? 你是对的。也许 OP 想要 Num.CellLines.Tissue: 1 & Num.CellLines.Tissue: 2 等。但至少 OP 现在可以选择这样做 啊,你可能是对的。我不明白为什么这是可取的。谢谢! @bashmike:我认为使用facet 是不可能的。您可能需要单独绘制每个面板,然后将它们合并在一起。请参阅此处的示例***.com/questions/47667729/… @bashmike:使用cowplot查看我的解决方案

以上是关于ggplot:如何使用 facet_grid 创建不同的 x 轴标题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ggplot_build 和 ggplot_gtable 调整 facet_grid 框架和箱线图之间的距离

如何使用不同的几何图形将边际总计添加到 ggplot2 facet_grid 图

R:ggplot2:facet_grid:如何在少数(不是全部)标签中包含数学表达式?

ggplot2,facet_grid 的 x 轴问题

使用 facet_grid 在 ggplot 中自动设置数据代表中断

ggplot2:从图中删除未使用的因子水平组合的方面(facet_grid)