bee*_*mer 18 r facet ggplot2 facet-wrap
我使用facet_wrap将我的散点图分割为
facet_wrap(x~y+z)
Run Code Online (Sandbox Code Playgroud)
根据需要,这会在我的案例中生成22个图.但是,这22个图中的每一个的标签显示为3行(x,y和z),这不必要地消耗窗口中的空间并将图块拼成一个小区域.我宁愿希望我的情节更大.由于变量y和z很短,我想将它们显示在同一行而不是两行中.
我查看了贴标机选项,但它们似乎都没有做我想要的.我很感激这里有任何建议.
小智 20
在这种情况下,您可能还会考虑label_wrap_gen():
p <- ggplot(mtcars, aes(wt,mpg)) + geom_point()
p + facet_wrap(cyl~am+vs, labeller = label_wrap_gen(multi_line=FALSE))
Run Code Online (Sandbox Code Playgroud)
eip*_*i10 10
我不知道如何使用贴标机功能,但另一种选择是创建一个分组变量,它将所有三个分类变量组合成一个可用于分面的变量.这是一个使用内置mtcars数据框和dplyr包的示例,用于动态创建新的分组变量.接下来是一个带有功能的更新,允许动态选择一到三个分面变量.
library(dplyr)
ggplot(mtcars %>% mutate(group = paste(cyl,am,vs, sep="-")),
aes(wt,mpg)) +
geom_point() +
facet_wrap(~group)
Run Code Online (Sandbox Code Playgroud)
更新:关于灵活性的注释,下面的代码是一个允许用户输入所需数据框和变量名的功能,包括动态选择一列,两列或三列的构面.
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)
}
Run Code Online (Sandbox Code Playgroud)
现在让我们试试这个功能:
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")
Run Code Online (Sandbox Code Playgroud)
这是我的热门搜索结果,所以我添加了一个包含 2022 年知识的答案。 ggplot 的labeller()方法现在有一个.multi_line参数,当 时FALSE,它将用逗号分隔分面标签,包括您是否想使用自定义标签器。
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
)
)
Run Code Online (Sandbox Code Playgroud)