【发布时间】:2020-12-15 03:20:12
【问题描述】:
我有一个解决方案来格式化嵌套的分面标签,效果非常好。解决方案由here 提供。
我需要提出另一个问题,因为我需要能够对列表进行子集化,但显然我无法在没有帮助的情况下弄清楚!
我需要做的:
我希望能够从列表中排除 Fac2。所以图表将只显示 Fac1 和 Fac3。我想我需要对这个列表进行子集List <- split(data,data$Fac_Map)。
- 在实际数据中,它是一个很长的 Fac 列表和一个宽图表,所以我想排除而不是列出所有包含的内容。
- 我将把 Fac2 放在由 ggarrange 连接的图表的末尾(这有两个原因,但无需深入了解真实数据的复杂性)。所以我需要能够过滤第一个函数 G 中的列表。
数据:
data <- structure(
list(
Fac_Map = structure(
c(1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 3L, 3L, 3L, 3L),
.Label = c("Fac1", "Fac2", "Fac3"),
class = "factor"
),
S_Residency = structure(
c(1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L,
1L, 1L, 2L, 2L),
.Label = c("Intl", "Local"),
class = "factor"
),
Period = structure(
c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L,
2L, 1L, 2L),
.Label = c("2019 P2", "2020 P2"),
class = "factor"
),
Result = c(92.9, 91.1, 85.8, 87.9, 94.1, 91.7, 87.5, 88.6,
90, 90.1, 87.4, 88.9)
),
class = "data.frame",
row.names = c(NA,-12L)
)
格式化由@Duck here提供的分面标签的工作解决方案
#Create list
List <- split(data,data$Fac_Map)
#Now function to plot
myplotfun <- function(x)
{
G <- ggplot(x,aes(x=Period,y=Result))+
geom_point() +
facet_grid(. ~ S_Residency,
scales = "free", space = "free") +
ylim(range(x$Result)) +
xlab("")+ylab("")+ggtitle(unique(x$Fac_Map))
return(G)
}
#Apply for plots
List2 <- lapply(List,myplotfun)
#Wrap final plot
wrap_plots(List2,nrow = 1)
是否可以过滤列表,这样我就可以只拥有 Fac1 和 Fac3 而不必对整个数据集进行子集化,这会阻止 ggarrange?
代码的输出:
【问题讨论】:
-
也许我没有完全理解这个问题,但是
wrap_plots(List2[-2],nrow = 1)有什么问题? -
感谢@teunbrand,这可能会有所帮助。我无法弄清楚如何将字符串“Fac2”传递给这个,这可以通过某种方式完成吗?我需要传入一个字符串,因为图形可以根据用户选择动态变化。
-
如果您想依赖字符匹配而不是已知位置,您可以执行以下操作:
rm_me <- match("Fac2", names(List2)); wrap_plots(List2[-rm_me],nrow = 1)