使用ggplot2创建子图:基于hflights包绘制工作日航班延误子图的轴设置问题
解决hflights按工作日分面展示航班延误的问题
别发愁,我来带你一步步搞定这个ggplot2分面配置的问题!咱们从数据预处理到画图全流程走一遍,确保你能得到想要的子图效果。
第一步:加载必要的工具包
首先得把需要的包装上并加载,hflights是核心数据,tidyverse包含了dplyr(处理数据)和ggplot2(画图),用起来更顺手:
# 如果没装过先安装 install.packages(c("hflights", "tidyverse")) # 加载包 library(hflights) library(tidyverse)
第二步:数据预处理(关键!)
首先要过滤掉取消的航班,然后把DayOfWeek和Month转换成更易读的格式——不然子图标题和x轴会是冰冷的数字,看着难受:
# 处理数据:过滤取消航班,转换日期字段 flight_data <- hflights %>% # 排除取消的航班(Cancelled=1是取消,所以取0) filter(Cancelled == 0) %>% # 把工作日数字转换成带名称的因子,确保顺序正确 mutate( DayOfWeek = factor(DayOfWeek, levels = 1:7, labels = c("周一", "周二", "周三", "周四", "周五", "周六", "周日")), # 把月份数字转换成英文名称(换成中文标签也可以,按需调整) Month = factor(Month, levels = 1:12, labels = month.name) ) %>% # 去掉延误时间为NA的行(避免画图报错) drop_na(ArrDelay)
这里我用了ArrDelay(到达延误),你也可以换成DepDelay(出发延误),根据你的需求调整就行。
第三步:用ggplot2画分面图(解决轴配置问题)
接下来就是核心的画图部分,用facet_wrap来按工作日生成子图,同时配置x轴(月份)和y轴(延误分钟数):
ggplot(flight_data, aes(x = Month, y = ArrDelay)) + # 用箱线图展示延误的分布(比散点图更适合看整体数据分布) geom_boxplot(fill = "#4287f5", alpha = 0.7) + # 按工作日分面,设置每行显示3个子图,调整轴的缩放规则 facet_wrap(~DayOfWeek, ncol = 3, scales = "free_y") + # 配置轴标签和标题 labs( x = "月份", y = "到达延误分钟数", title = "各工作日航班到达延误分布(按月份)" ) + # 优化主题,让x轴标签倾斜,避免重叠 theme_bw() + theme( axis.text.x = element_text(angle = 45, hjust = 1), plot.title = element_text(hjust = 0.5, size = 14, face = "bold") )
关于轴配置的关键说明:
scales = "free_y":让每个子图的y轴范围可以根据自己的数据自动调整(因为不同工作日的延误范围可能不一样),如果想让所有子图的y轴完全一致,改成scales = "fixed"就行。- x轴用了转换后的月份名称,避免了数字显示,而且通过
axis.text.x设置倾斜,防止标签重叠。 - 如果想用
facet_grid,可以写成facet_grid(. ~ DayOfWeek)(把工作日排成一行)或者facet_grid(DayOfWeek ~ .)(排成一列),但facet_wrap更灵活,适合这种单一维度的分面。
效果验证
运行上面的代码后,你会得到7个子图(对应7个工作日),每个子图的x轴都是12个月份,y轴是对应的延误分钟数,完全符合你的需求。如果还有细节要调整(比如颜色、子图数量),直接修改代码里的参数就行!
内容的提问来源于stack exchange,提问作者ManjiroSano
相关产品推荐
相关产品推荐

