ggplot2 facet_grid 带有分面标题
ggplot2 facet_grid with facet titles
是否有在 facet_grid
中添加分面标题的规范方法?或者 facet_wrap
中特定行标签的方法? (没有 geom_text
、geom_label
或 grob 操作。)
考虑:
dat <- data.frame(rowInd = paste0("R", c(1, 2, 2, 3, 3, 3)), colInd = paste0("C", c(1, 1, 2, 1, 2, 3)),
facetName = c("1-10", "60-70", "80-90", "100-110", "120-130", "140-150"), val=1:6)
dat
# rowInd colInd facetName val
# 1 R1 C1 1-10 1
# 2 R2 C1 60-70 2
# 3 R2 C2 80-90 3
# 4 R3 C1 100-110 4
# 5 R3 C2 120-130 5
# 6 R3 C3 140-150 6
直接绘图给出:
library(ggplot2)
ggplot(dat, aes(x=1, y=val)) + facet_grid(rowInd ~ facetName, switch="y") # 1
ggplot(dat, aes(x=1, y=val)) + facet_wrap(rowInd ~ facetName) # 2
ggplot(dat, aes(x=1, y=val)) + facet_grid(rowInd ~ colInd, switch="y") # 3
其中:
- 包括我想要的行和面标签,但并非所有面标签都适用于所有行;
- 正确地将 row-label (
"R1"
) 与 facet 标签关联,并且每个 facet 一个标签,但丢失了 facet 之间的行从属关系;
- 丢失小平面标签。
最终我正在尝试做类似于以下之一的事情:
如果需要,我可以“填写”数据(也许是为了便于绘制正确的图),不过最好让它们自动 hollow-plots 或空 space.
因为您没有明确排除“拼凑”选项...在 Axeman 的带领下,这里尝试自动化它。
我知道它有点老套,而且 y 标签反复出现(这当然需要一些调整),而且它肯定不是“规范的”,但是放在一起很有趣……:)
library(tidyverse)
library(patchwork)
dat <- data.frame(rowInd = paste0("R", c(1, 2, 2, 3, 3, 3)), colInd = paste0("C", c(1, 1, 2, 1, 2, 3)),
facetName = c("1-10", "60-70", "80-90", "100-110", "120-130", "140-150"), val=1:6)
ls_p <-
dat %>%
mutate(row_facet= paste(rowInd, facetName, sep = "_")) %>%
split(., .$row_facet) %>%
purrr::map(., .f = ~ {
ggplot(., aes(x=1, y=val)) + facet_grid(rowInd ~ facetName, switch = "y")})
split_ls <- split(ls_p, dat$rowInd)
lengths_rowInd <- lengths(split_ls)
col_len <- max(lengths_rowInd)
lengths_empty <- col_len - lengths_rowInd
p_empty <- ggplot() + theme_void()
ls_empty_p <- lapply(lengths_empty, function(x) rep(list(p_empty), x))
ls_filled_p <- Map(append, split_ls, ls_empty_p)
new_list <- do.call(list, unlist(ls_filled_p, recursive=FALSE))
wrap_plots(new_list)
由 reprex package (v0.3.0)
于 2020-06-23 创建
是否有在 facet_grid
中添加分面标题的规范方法?或者 facet_wrap
中特定行标签的方法? (没有 geom_text
、geom_label
或 grob 操作。)
考虑:
dat <- data.frame(rowInd = paste0("R", c(1, 2, 2, 3, 3, 3)), colInd = paste0("C", c(1, 1, 2, 1, 2, 3)),
facetName = c("1-10", "60-70", "80-90", "100-110", "120-130", "140-150"), val=1:6)
dat
# rowInd colInd facetName val
# 1 R1 C1 1-10 1
# 2 R2 C1 60-70 2
# 3 R2 C2 80-90 3
# 4 R3 C1 100-110 4
# 5 R3 C2 120-130 5
# 6 R3 C3 140-150 6
直接绘图给出:
library(ggplot2)
ggplot(dat, aes(x=1, y=val)) + facet_grid(rowInd ~ facetName, switch="y") # 1
ggplot(dat, aes(x=1, y=val)) + facet_wrap(rowInd ~ facetName) # 2
ggplot(dat, aes(x=1, y=val)) + facet_grid(rowInd ~ colInd, switch="y") # 3
其中:
- 包括我想要的行和面标签,但并非所有面标签都适用于所有行;
- 正确地将 row-label (
"R1"
) 与 facet 标签关联,并且每个 facet 一个标签,但丢失了 facet 之间的行从属关系; - 丢失小平面标签。
最终我正在尝试做类似于以下之一的事情:
如果需要,我可以“填写”数据(也许是为了便于绘制正确的图),不过最好让它们自动 hollow-plots 或空 space.
因为您没有明确排除“拼凑”选项...在 Axeman 的带领下,这里尝试自动化它。
我知道它有点老套,而且 y 标签反复出现(这当然需要一些调整),而且它肯定不是“规范的”,但是放在一起很有趣……:)
library(tidyverse)
library(patchwork)
dat <- data.frame(rowInd = paste0("R", c(1, 2, 2, 3, 3, 3)), colInd = paste0("C", c(1, 1, 2, 1, 2, 3)),
facetName = c("1-10", "60-70", "80-90", "100-110", "120-130", "140-150"), val=1:6)
ls_p <-
dat %>%
mutate(row_facet= paste(rowInd, facetName, sep = "_")) %>%
split(., .$row_facet) %>%
purrr::map(., .f = ~ {
ggplot(., aes(x=1, y=val)) + facet_grid(rowInd ~ facetName, switch = "y")})
split_ls <- split(ls_p, dat$rowInd)
lengths_rowInd <- lengths(split_ls)
col_len <- max(lengths_rowInd)
lengths_empty <- col_len - lengths_rowInd
p_empty <- ggplot() + theme_void()
ls_empty_p <- lapply(lengths_empty, function(x) rep(list(p_empty), x))
ls_filled_p <- Map(append, split_ls, ls_empty_p)
new_list <- do.call(list, unlist(ls_filled_p, recursive=FALSE))
wrap_plots(new_list)
由 reprex package (v0.3.0)
于 2020-06-23 创建