使用facet_wrap在ggplot中显示每个面的x轴

ymzxtsji  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(175)

我正在尝试为一个需要分面的出版物创建一个绘图。它必须在每个分面上显示相同的x轴,并保持每个y轴度量单位的均匀间距。
facet_grid允许我创建我想要的y度量间距,但是我不能让x轴显示每个面。
facet_wrap允许我在每个面上显示x轴,但是它破坏了y度量间距。每个x轴的值也不同,我需要它们相同。
facet_rep_grid看起来应该是一个解决方案,但它抛出了一个错误“Error in axisgrob$height$arg1:$运算符对于原子向量无效”
使用patchwork似乎是一个解决方案,但这也会破坏y轴间距,我需要每个网格都完全相同。
我刚才描述的图的可重复的例子:

install.packages("lemon")
library(lemon)
data("mtcars")

df <- mtcars %>%
  rownames_to_column(var = "car")

mt <- ggplot(df, aes(mpg, car, colour = factor(cyl))) +
  theme(strip.placement = "outside")+
  geom_point()

# Good y metric spacing, can't get x-axis to show on each
mt + 
  facet_grid(vars(cyl), switch = "y", scales = "free", space = "free") 

# Incorrect y metric spacing, shows x-axis on each but uses different scales
mt + 
  facet_wrap(~cyl,  scales = "free", ncol=1, switch = "y") 

# Throws an error

mt +
  facet_rep_grid(vars(cyl), scales = "free"
                 , switch = "both", space = "free")

facet_grid版本:

facet_wrap版本:

u59ebvdq

u59ebvdq1#

你的最终解决方案对我有效。

mt +
  facet_rep_grid(vars(cyl), scales = "free"
                 , switch = "both", space = "free",
                 repeat.tick.labels = T)

如果你仍然得到一个错误,你可以张贴它吗?我不得不重新安装rlangvctrs包,让它工作。

w41d8nur

w41d8nur2#

实际上使用lemon::facet_rep_grid对我来说很好,但是另一个选项是ggh4x::facet_grid2,它也允许添加内部轴:

library(ggplot2)
library(ggh4x)
library(tibble)

df <- mtcars %>%
  rownames_to_column(var = "car")

mt <- ggplot(df, aes(mpg, car, colour = factor(cyl))) +
  theme(strip.placement = "outside") +
  geom_point()

mt +
  facet_grid2(cyl ~ .,
    scales = "free_y",
    axes = "x", space = "free_y", switch = "y"
  )

sdnqo3pr

sdnqo3pr3#

以下是使用完全不同方法的近似解:

library(tidyverse)

df_list <- mtcars %>%
  rownames_to_column("car") %>%
  group_split(cyl)

create_plot <- function(df) {
  ggplot(df, aes(mpg, car, color = factor(cyl))) +
    theme(strip.placement = "outside") +
    geom_point(show.legend = FALSE) +
    xlim(0, 30) +
    scale_color_manual(values = c("red", "green", "blue"),
                       limits = levels(factor(mtcars$cyl)))+
    facet_grid(cyl ~ .,
                scales = "free_y", switch = "y")
}

# Use map to apply function to each data frame in list
plots_list <- map(df_list, create_plot)

library(patchwork)
plots_list[[1]] / plots_list[[2]] / plots_list[[3]] + plot_layout(ncol = 1, heights = c(0.8, 0.5, 1))

相关问题