为 facet_wrap 中的每个方面添加标题
Adding titles to each facet in facet_wrap
我很好奇是否可以在 facet_wrap 中的每个方面放置轴标题。我可以靠近,但无法正确显示 x 和 y。该代码当前在同一轴上同时显示 x 和 y。我知道这不是它应该如何运作,但我想看看是否可以在不进行更复杂的操作(用 grob 或其他东西安排单独的地块)的情况下完成它。
简而言之,我希望y_names和x_names出现在各自的坐标轴上。
testdat<-data.frame(x_names=c("A","B","C"),x_vals=c(1,2,3),y_names=c("B","C","A"), y_vals=c(2,3,1))
ggplot(testdat, aes(x_vals, y_vals)) +
geom_point(pch=21) +
facet_wrap(y_names~x_names,
ncol=1,
scales="free",
strip.position="left",
labeller=as_labeller(c(A= "Apple",
B= "Bread",
C= "Cantaloupe"))
)+
theme( strip.background = element_blank(),
strip.placement = "outside",
axis.title.x=element_blank(),
axis.title.y=element_blank())
我不确定你的意思 - 也许是这个?
library(ggplot2)
testdat <- data.frame(x_names = c("A","B","C"),
x_vals = c(1, 2, 3),
y_names = c("B", "C", "A"),
y_vals = c(2, 3, 1))
ggplot(testdat, aes(x_vals, y_vals)) +
geom_point(pch = 21) +
facet_grid(y_names ~ x_names,
labeller = as_labeller(c(A = "Apple",
B = "Bread",
C = "Cantaloupe")),
switch = "both") +
theme( strip.background = element_blank(),
strip.placement = "outside",
axis.title.x = element_blank(),
axis.title.y = element_blank())
编辑
当两个分面因素完全相关时,OP 似乎想要三个(可能完全不相关的)图。这相当于对单个变量进行分面。但是,我们希望每个方面都有一个单独的轴。可能有几种方法可以直接在 ggplot 中实现这一点,但它们都非常复杂,包括添加自定义注释。
我认为在这种情况下,到目前为止最简单和最自由的方法是使用 gridExtra::grid.arrange
将地块添加在一起,这不需要任何黑客攻击或 grob 操作。就这么简单:
p1 <- ggplot(filter(testdat, x_names == "A", y_names == "B"), aes(x_vals, y_vals)) +
geom_point() + labs(x = "Apple", y = "Banana")
p2 <- ggplot(filter(testdat, x_names == "B", y_names == "C"), aes(x_vals, y_vals)) +
geom_point() + labs(x = "Banana", y = "Cherry")
p3 <- ggplot(filter(testdat, x_names == "C", y_names == "A"), aes(x_vals, y_vals)) +
geom_point() + labs(x = "Cherry", y = "Apple")
gridExtra::grid.arrange(p1 , p2, p3)
由 reprex package (v0.3.0)
于 2020-07-22 创建
问题:
“我很好奇是否可以在 facet_wrap 中的每个方面放置轴标题。”
答案:
是的,这是可能的。
但是...你应该这样做吗?编号
Faceting 为您的绘图添加了一个额外的维度,即给定一个 x 和一个 y 变量,第三个变量用于对数据进行子集化,例如 z.
你有一个隐含的代码请求来显示带有 多个 x 和 y 变量的图,因此你不应该使用分面。相反,应该有三个不同的情节:Allan Cameron 提供了一个很好的解决方案。
ggplot2 书解释了这里应该使用什么分面:https://ggplot2-book.org/facet.html。
我很好奇是否可以在 facet_wrap 中的每个方面放置轴标题。我可以靠近,但无法正确显示 x 和 y。该代码当前在同一轴上同时显示 x 和 y。我知道这不是它应该如何运作,但我想看看是否可以在不进行更复杂的操作(用 grob 或其他东西安排单独的地块)的情况下完成它。
简而言之,我希望y_names和x_names出现在各自的坐标轴上。
testdat<-data.frame(x_names=c("A","B","C"),x_vals=c(1,2,3),y_names=c("B","C","A"), y_vals=c(2,3,1))
ggplot(testdat, aes(x_vals, y_vals)) +
geom_point(pch=21) +
facet_wrap(y_names~x_names,
ncol=1,
scales="free",
strip.position="left",
labeller=as_labeller(c(A= "Apple",
B= "Bread",
C= "Cantaloupe"))
)+
theme( strip.background = element_blank(),
strip.placement = "outside",
axis.title.x=element_blank(),
axis.title.y=element_blank())
我不确定你的意思 - 也许是这个?
library(ggplot2)
testdat <- data.frame(x_names = c("A","B","C"),
x_vals = c(1, 2, 3),
y_names = c("B", "C", "A"),
y_vals = c(2, 3, 1))
ggplot(testdat, aes(x_vals, y_vals)) +
geom_point(pch = 21) +
facet_grid(y_names ~ x_names,
labeller = as_labeller(c(A = "Apple",
B = "Bread",
C = "Cantaloupe")),
switch = "both") +
theme( strip.background = element_blank(),
strip.placement = "outside",
axis.title.x = element_blank(),
axis.title.y = element_blank())
编辑
当两个分面因素完全相关时,OP 似乎想要三个(可能完全不相关的)图。这相当于对单个变量进行分面。但是,我们希望每个方面都有一个单独的轴。可能有几种方法可以直接在 ggplot 中实现这一点,但它们都非常复杂,包括添加自定义注释。
我认为在这种情况下,到目前为止最简单和最自由的方法是使用 gridExtra::grid.arrange
将地块添加在一起,这不需要任何黑客攻击或 grob 操作。就这么简单:
p1 <- ggplot(filter(testdat, x_names == "A", y_names == "B"), aes(x_vals, y_vals)) +
geom_point() + labs(x = "Apple", y = "Banana")
p2 <- ggplot(filter(testdat, x_names == "B", y_names == "C"), aes(x_vals, y_vals)) +
geom_point() + labs(x = "Banana", y = "Cherry")
p3 <- ggplot(filter(testdat, x_names == "C", y_names == "A"), aes(x_vals, y_vals)) +
geom_point() + labs(x = "Cherry", y = "Apple")
gridExtra::grid.arrange(p1 , p2, p3)
问题:
“我很好奇是否可以在 facet_wrap 中的每个方面放置轴标题。”
答案:
是的,这是可能的。
但是...你应该这样做吗?编号
Faceting 为您的绘图添加了一个额外的维度,即给定一个 x 和一个 y 变量,第三个变量用于对数据进行子集化,例如 z.
你有一个隐含的代码请求来显示带有 多个 x 和 y 变量的图,因此你不应该使用分面。相反,应该有三个不同的情节:Allan Cameron 提供了一个很好的解决方案。
ggplot2 书解释了这里应该使用什么分面:https://ggplot2-book.org/facet.html。