使用ggplot与dplyr按月份分组绘图时出现错误的技术求助
嘿,我来帮你搞定这个问题!你遇到的错误是因为ggplot2并不接受dplyr分组后的grouped_df对象——group_by()是给dplyr做数据聚合、变换这类操作时用的分组逻辑,和ggplot的绘图逻辑完全不搭。
你想要按月份分别绘制各年份x与y的散点图,其实有两种常用的正确做法,按需选择即可:
方法1:用分面(Facet)把所有月份的图放在一张画布上
这是最常用的方式,所有子图共享坐标轴,对比起来非常方便:
# 设置随机种子让结果可复现 set.seed(123) dat <- data.frame(year = rep(2012:2015, each = 9), month = rep(4:12, times = 4), y = runif(36), x = runif(36)) library(ggplot2) library(dplyr) ggplot(dat, aes(x = x, y = y, colour = factor(year))) + geom_point(size = 2) + # 调大点的尺寸让图更清晰 facet_wrap(~month) + # 按月份拆分出独立子图 labs(colour = "Year") + # 给图例改个更易懂的名字 theme_bw() # 换个清爽的主题
这样每个月份会生成一个子图,里面用颜色区分不同年份的点,数据对比一目了然。
方法2:生成单独的月份图表(每个月一张独立图)
如果你需要每个月份输出独立的ggplot对象,后续可以单独保存或查看,可以用group_split()配合purrr::map()来实现:
library(purrr) # 按月份拆分数据,逐个生成图表 month_plots <- dat %>% group_split(month) %>% map(function(df) { ggplot(df, aes(x = x, y = y, colour = factor(year))) + geom_point() + ggtitle(paste("Scatter Plot - Month", unique(df$month))) + theme_minimal() }) # 查看4月份的图 month_plots[[1]] # 如果要批量保存所有图,可以用walk2循环处理 walk2(month_plots, unique(dat$month), function(plot, m) { ggsave(paste0("month_", m, "_scatter.png"), plot, width=6, height=4) })
简单总结下:别用group_by()给ggplot传数据,要么用分面在一张图里展示所有月份,要么拆分数据生成独立图表,这两种方式都能完美实现你的需求~
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

