ggplot2:将多变量 facet_wrap 标签放在一行上
ggplot2: Put multi-variable facet_wrap labels on one line
我正在使用 facet_wrap 将散点图拆分为
facet_wrap(x~y+z)
在我的案例中,这会根据需要生成 22 个图。但是,这 22 个地块中的每一个的标签都显示在 3 行(x、y 和 z)中,这不必要地消耗了 window 中的 space 并将地块挤压到一个小区域。我宁愿希望我的地块更大。由于变量 y 和 z 很短,我想将它们显示在同一行而不是两行。
我查看了贴标机选项,但 none 似乎符合我的要求。如果有任何建议,我将不胜感激。
我不确定如何使用标签函数执行此操作,但另一种选择是创建一个分组变量,将所有三个分类变量组合成一个可用于分面的变量。下面是一个使用内置 mtcars
数据框和 dplyr
包动态创建新分组变量的示例。接下来是一个更新,其中包含一个允许动态选择一到三个分面变量的函数。
library(dplyr)
ggplot(mtcars %>% mutate(group = paste(cyl,am,vs, sep="-")),
aes(wt,mpg)) +
geom_point() +
facet_wrap(~group)
更新:关于灵活性的评论,下面的代码是一个函数,允许用户输入所需的数据框和变量名称,包括动态选择一个方面、两列或三列。
library(dplyr)
library(lazyeval)
mygg = function(dat, v1, v2, f1, f2=NA, f3=NA) {
dat = dat %>%
mutate_(group =
if (is.na(f2)) {
f1
} else if (is.na(f3)) {
interp(~paste(f1,f2, sep='-'), f1=as.name(f1), f2=as.name(f2))
} else {
interp(~paste(f1,f2,f3,sep='-'), f1=as.name(f1), f2=as.name(f2), f3=as.name(f3))
})
ggplot(dat, aes_string(v1,v2)) +
geom_point() +
facet_wrap(~group)
}
现在让我们试试这个功能:
library(vcd) # For Arthitis data frame
mygg(Arthritis, "ID","Age","Sex","Treatment","Improved")
mygg(mtcars, "wt","mpg","cyl","am")
mygg(iris, "Petal.Width","Petal.Length","Species")
在这种情况下,您还可以考虑 label_wrap_gen()
:
p <- ggplot(mtcars, aes(wt,mpg)) + geom_point()
p + facet_wrap(cyl~am+vs, labeller = label_wrap_gen(multi_line=FALSE))
这对我来说是最热门的搜索结果,所以我添加了一个包含 2022 年知识的答案。ggplot 的 labeller()
方法现在有一个 .multi_line
参数,当 FALSE
, 将 comma-separate 分面标签,包括是否要使用自定义标签。
library(tidyverse)
ggplot(mtcars, aes(wt,mpg)) +
geom_point() +
facet_wrap(~ cyl + gear + carb, labeller =
labeller(
cyl = ~ paste("Cylinder: ", .),
gear = ~ paste("Gear: ", .),
carb = ~ paste("Carb: ", .),
.multi_line = FALSE
)
)
我正在使用 facet_wrap 将散点图拆分为
facet_wrap(x~y+z)
在我的案例中,这会根据需要生成 22 个图。但是,这 22 个地块中的每一个的标签都显示在 3 行(x、y 和 z)中,这不必要地消耗了 window 中的 space 并将地块挤压到一个小区域。我宁愿希望我的地块更大。由于变量 y 和 z 很短,我想将它们显示在同一行而不是两行。
我查看了贴标机选项,但 none 似乎符合我的要求。如果有任何建议,我将不胜感激。
我不确定如何使用标签函数执行此操作,但另一种选择是创建一个分组变量,将所有三个分类变量组合成一个可用于分面的变量。下面是一个使用内置 mtcars
数据框和 dplyr
包动态创建新分组变量的示例。接下来是一个更新,其中包含一个允许动态选择一到三个分面变量的函数。
library(dplyr)
ggplot(mtcars %>% mutate(group = paste(cyl,am,vs, sep="-")),
aes(wt,mpg)) +
geom_point() +
facet_wrap(~group)
更新:关于灵活性的评论,下面的代码是一个函数,允许用户输入所需的数据框和变量名称,包括动态选择一个方面、两列或三列。
library(dplyr)
library(lazyeval)
mygg = function(dat, v1, v2, f1, f2=NA, f3=NA) {
dat = dat %>%
mutate_(group =
if (is.na(f2)) {
f1
} else if (is.na(f3)) {
interp(~paste(f1,f2, sep='-'), f1=as.name(f1), f2=as.name(f2))
} else {
interp(~paste(f1,f2,f3,sep='-'), f1=as.name(f1), f2=as.name(f2), f3=as.name(f3))
})
ggplot(dat, aes_string(v1,v2)) +
geom_point() +
facet_wrap(~group)
}
现在让我们试试这个功能:
library(vcd) # For Arthitis data frame
mygg(Arthritis, "ID","Age","Sex","Treatment","Improved")
mygg(mtcars, "wt","mpg","cyl","am")
mygg(iris, "Petal.Width","Petal.Length","Species")
在这种情况下,您还可以考虑 label_wrap_gen()
:
p <- ggplot(mtcars, aes(wt,mpg)) + geom_point()
p + facet_wrap(cyl~am+vs, labeller = label_wrap_gen(multi_line=FALSE))
这对我来说是最热门的搜索结果,所以我添加了一个包含 2022 年知识的答案。ggplot 的 labeller()
方法现在有一个 .multi_line
参数,当 FALSE
, 将 comma-separate 分面标签,包括是否要使用自定义标签。
library(tidyverse)
ggplot(mtcars, aes(wt,mpg)) +
geom_point() +
facet_wrap(~ cyl + gear + carb, labeller =
labeller(
cyl = ~ paste("Cylinder: ", .),
gear = ~ paste("Gear: ", .),
carb = ~ paste("Carb: ", .),
.multi_line = FALSE
)
)