如何为ggplot2分面图的每个子图单独设置ylim()?
分面子图单独设置y轴范围的解决方法
方案1:自动适配各子图y轴范围
全局ylim()会强制所有子图使用同一y轴范围,只需给facet_grid添加scales = "free_y"参数,就能让每个子图根据自身数据自动匹配合适的y轴范围:
ggplot(data = Factors, mapping = aes(x = as.Date(Date,"%m/%d/%Y"), y = Variable, group = 1)) + geom_line(group = 1) + facet_grid(rows=vars(Group), scales = "free_y") + # 核心修改:开启y轴自由缩放 labs(x = "Date", y = "Variable") + scale_x_date(date_breaks = "week", date_labels = "%b %d")
如果要改成散点图,直接把geom_line(group = 1)替换为geom_point()即可:
ggplot(data = Factors, mapping = aes(x = as.Date(Date,"%m/%d/%Y"), y = Variable, group = 1)) + geom_point() + # 替换为散点图层 facet_grid(rows=vars(Group), scales = "free_y") + labs(x = "Date", y = "Variable") + scale_x_date(date_breaks = "week", date_labels = "%b %d")
方案2:手动指定每个分组的精确y轴范围
如果需要严格按照你给出的范围(温度10-30、盐度20-40、叶绿素0-10)设置,先定义分组与y轴范围的映射表,再通过自定义函数指定每个子图的y轴限制:
- 先创建分组映射:
# 按分组名称定义对应的y轴范围 y_range_map <- list( 温度 = c(10, 30), 盐度 = c(20, 40), 叶绿素 = c(0, 10) )
- 修改绘图代码,手动绑定每个分组的y轴范围:
ggplot(data = Factors, mapping = aes(x = as.Date(Date,"%m/%d/%Y"), y = Variable, group = 1)) + geom_line(group = 1) + facet_grid(rows=vars(Group), scales = "free_y") + labs(x = "Date", y = "Variable") + scale_x_date(date_breaks = "week", date_labels = "%b %d") + scale_y_continuous( limits = function(x) { # 根据当前子图的数据匹配对应的分组范围 current_group <- unique(Factors$Group[Factors$Variable >= min(x) & Factors$Variable <= max(x)]) y_range_map[[current_group]] } )
同样,把geom_line换成geom_point就能得到指定y范围的散点分面图。
内容的提问来源于stack exchange,提问作者R-ookie
相关产品推荐
相关产品推荐

