我有这个数据
library(ggplot2)
dat = data.frame(x = c(1,2,1,2),
group = c("a","a","b","b"),
y = c(10,20,1000,2000))
ggplot(dat, aes(x = x, y = y)) +
geom_point() +
geom_line() +
facet_wrap(~group, ncol = 1) +
coord_cartesian(ylim = c(0, 30))
您可以看到B组未显示,因为我将y限制设置为0,30
。我想手动为每个图表设置单独的y限制。我不想使用scales = "free_y"
,因为我需要控制每个图表中的限制。
有没有办法可以做到这一点?你能以某种方式为facet wrap中的每个图表提供y限制吗?
答案 0 :(得分:11)
除非您想减少绘图区域(即不绘制某些点),否则在使用scales = "free_y"
时,您仍然可以对y限制进行“完全”控制。
您可以使用我提供的相同技巧来回答您的其他问题:how to set limits on rounded facet wrap y axis?
dat <- data.table(dat)
dat[,y_min := y*0.5, by = group]
dat[,y_max:= y*1.5, by = group]
ggplot(dat, aes(x = x, y = y)) +
geom_point() +
geom_line() +
facet_wrap(~group, ncol = 1, scales = "free_y") +
geom_blank(aes(y = y_min)) +
geom_blank(aes(y = y_max))
对于阅读此问题的其他人,技巧是为每个组明确创建y_min
和y_max
个变量。并通过geom_blank()
“绘制”它们。 (实际上没有绘制任何内容,但每个方面的绘图区域都是根据该组的y_min
和y_max
值进行调整的。)
如果由于某些原因,你想手动给出最小值和最大值(而不是规则),没有人会阻止你。但这很乏味:
dat[group == "a",y_min := 0]
dat[group == "a",y_max := 30]
dat[group == "b",y_min := 0]
dat[group == "b",y_max := 3000]
ggplot(dat, aes(x = x, y = y)) +
geom_point() +
geom_line() +
facet_wrap(~group, ncol = 1, scales = "free_y") +
geom_blank(aes(y = y_min)) +
geom_blank(aes(y = y_max))