如何在R中合并多月份独立图表,生成年度趋势图?
问题
接触R语言仅7天,现有代码读取JSON格式的2021年每日新增账户数据,已生成1-12月的月度独立图表,希望将这些图表合并为一张覆盖全年的连续趋势图。尝试使用ts()函数时因多系列数量限制报错,改用ggplot2时又遇到数据映射错误,无法完成合并绘图,附上当前代码与样本数据。
原代码
library("dplyr") library("rjson") library("ggplot2") json_file = "./sliceA.json" # Main data. my.JSON = fromJSON(file=json_file, simplify = TRUE) df = lapply(my.JSON, function(d) { data.frame(matrix(unlist(d), ncol=3, byrow=TRUE)) }) df = do.call(rbind, df) names(df) = c("Year", "Month", "Day") m = table(df$Month) yr = table(df$Year) d = table(df$Day) yrChr = function(mon,year) { x = data.frame(ftable(df[df$Year == year,])[,c(1:31)]) y = c(1:31) # This value was changed many times to try to adjust, but to no avail. ggplot(x, aes(x = x, y = y)) + geom_line() # The line throws an error, because both "x" and "y" are not appropriate. ggsave("Rplots.pdf") } ii = 0 while (ii < 12) { ii = ii+1 yrChr(ii,2021) }
样本数据(dput输出)
structure(list(X1 = c(3L, 3L, 3L, 8L, 7L, 2L, 9L, 5L, 5L, 2L, 4L, 3L), X2 = c(2L, 5L, 8L, 7L, 4L, 7L, 5L, 5L, 2L, 1L, 5L, 6L ), X3 = c(7L, 39L, 7L, 7L, 5L, 7L, 5L, 4L, 1L, 1L, 5L, 5L), X4 = c(2L, 16L, 9L, 7L, 9L, 12L, 9L, 7L, 1L, 4L, 5L, 6L), X5 = c(7L, 4L, 5L, 2L, 8L, 1L, 6L, 7L, 4L, 5L, 2L, 1L), X6 = c(2L, 2L, 4L, 4L, 9L, 9L, 15L, 5L, 2L, 3L, 2L, 1L), X7 = c(3L, 11L, 5L, 8L, 5L, 4L, 5L, 2L, 0L, 0L, 5L, 5L), X8 = c(5L, 20L, 0L, 4L, 7L, 1L, 4L, 2L, 1L, 5L, 2L, 1L), X9 = c(2L, 128L, 4L, 12L, 10L, 2L, 8L, 5L, 5L, 1L, 4L, 2L), X10 = c(5L, 36L, 9L, 4L, 10L, 10L, 3L, 2L, 3L, 5L, 5L, 7L), X11 = c(7L, 31L, 9L, 9L, 5L, 10L, 8L, 6L, 5L, 2L, 3L, 5L), X12 = c(3L, 17L, 9L, 7L, 4L, 4L, 3L, 5L, 7L, 2L, 4L, 8L), X13 = c(5L, 83L, 6L, 5L, 5L, 3L, 3L, 8L, 2L, 1L, 3L, 7L), X14 = c(2L, 51L, 7L, 2L, 6L, 5L, 2L, 1L, 5L, 6L, 5L, 0L), X15 = c(2L, 44L, 10L, 5L, 6L, 5L, 7L, 6L, 2L, 1L, 6L, 5L), X16 = c(5L, 37L, 5L, 9L, 5L, 6L, 8L, 5L, 2L, 1L, 4L, 1L), X17 = c(5L, 6L, 3L, 6L, 11L, 7L, 4L, 6L, 6L, 7L, 4L, 5L), X18 = c(3L, 5L, 2L, 11L, 4L, 5L, 7L, 5L, 3L, 5L, 3L, 3L), X19 = c(4L, 13L, 6L, 8L, 3L, 6L, 2L, 4L, 4L, 4L, 8L, 4L), X20 = c(4L, 10L, 7L, 2L, 7L, 5L, 6L, 3L, 2L, 5L, 6L, 6L), X21 = c(5L, 5L, 1L, 6L, 9L, 4L, 4L, 2L, 7L, 6L, 8L, 4L), X22 = c(6L, 9L, 7L, 5L, 5L, 3L, 5L, 4L, 3L, 4L, 6L, 3L), X23 = c(4L, 10L, 5L, 5L, 7L, 1L, 2L, 2L, 2L, 1L, 1L, 4L), X24 = c(5L, 11L, 3L, 7L, 4L, 7L, 1L, 1L, 3L, 1L, 7L, 3L), X25 = c(3L, 8L, 11L, 2L, 6L, 9L, 3L, 2L, 2L, 2L, 6L, 10L), X26 = c(3L, 9L, 8L, 7L, 7L, 8L, 7L, 0L, 3L, 3L, 3L, 2L), X27 = c(15L, 13L, 6L, 4L, 7L, 4L, 4L, 1L, 4L, 5L, 9L, 6L), X28 = c(10L, 7L, 4L, 5L, 6L, 3L, 4L, 4L, 1L, 4L, 9L, 4L), X29 = c(2L, 0L, 5L, 10L, 6L, 2L, 6L, 2L, 2L, 6L, 2L, 5L), X30 = c(4L, 0L, 1L, 10L, 9L, 9L, 4L, 4L, 6L, 4L, 8L, 7L), X31 = c(12L, 0L, 8L, 0L, 2L, 0L, 5L, 1L, 0L, 4L, 0L, 3L)), class = "data.frame", row.names = c(NA, -12L))
解决方案
核心问题是数据格式不符合ggplot2要求:它需要长格式数据(每行对应一个日期的新增账户数),而非你当前的宽格式(每行是一个月,每列是某天)。以下是完整修复流程:
步骤1:转换数据为长格式
针对样本数据的处理
# 加载必要包 library(dplyr) library(ggplot2) # 导入样本数据 sample_df <- structure(list(X1 = c(3L, 3L, 3L, 8L, 7L, 2L, 9L, 5L, 5L, 2L, 4L, 3L), X2 = c(2L, 5L, 8L, 7L, 4L, 7L, 5L, 5L, 2L, 1L, 5L, 6L), X3 = c(7L, 39L, 7L, 7L, 5L, 7L, 5L, 4L, 1L, 1L, 5L, 5L), X4 = c(2L, 16L, 9L, 7L, 9L, 12L, 9L, 7L, 1L, 4L, 5L, 6L), X5 = c(7L, 4L, 5L, 2L, 8L, 1L, 6L, 7L, 4L, 5L, 2L, 1L), X6 = c(2L, 2L, 4L, 4L, 9L, 9L, 15L, 5L, 2L, 3L, 2L, 1L), X7 = c(3L, 11L, 5L, 8L, 5L, 4L, 5L, 2L, 0L, 0L, 5L, 5L), X8 = c(5L, 20L, 0L, 4L, 7L, 1L, 4L, 2L, 1L, 5L, 2L, 1L), X9 = c(2L, 128L, 4L, 12L, 10L, 2L, 8L, 5L, 5L, 1L, 4L, 2L), X10 = c(5L, 36L, 9L, 4L, 10L, 10L, 3L, 2L, 3L, 5L, 5L, 7L), X11 = c(7L, 31L, 9L, 9L, 5L, 10L, 8L, 6L, 5L, 2L, 3L, 5L), X12 = c(3L, 17L, 9L, 7L, 4L, 4L, 3L, 5L, 7L, 2L, 4L, 8L), X13 = c(5L, 83L, 6L, 5L, 5L, 3L, 3L, 8L, 2L, 1L, 3L, 7L), X14 = c(2L, 51L, 7L, 2L, 6L, 5L, 2L, 1L, 5L, 6L, 5L, 0L), X15 = c(2L, 44L, 10L, 5L, 6L, 5L, 7L, 6L, 2L, 1L, 6L, 5L), X16 = c(5L, 37L, 5L, 9L, 5L, 6L, 8L, 5L, 2L, 1L, 4L, 1L), X17 = c(5L, 6L, 3L, 6L, 11L, 7L, 4L, 6L, 6L, 7L, 4L, 5L), X18 = c(3L, 5L, 2L, 11L, 4L, 5L, 7L, 5L, 3L, 5L, 3L, 3L), X19 = c(4L, 13L, 6L, 8L, 3L, 6L, 2L, 4L, 4L, 4L, 8L, 4L), X20 = c(4L, 10L, 7L, 2L, 7L, 5L, 6L, 3L, 2L, 5L, 6L, 6L), X21 = c(5L, 5L, 1L, 6L, 9L, 4L, 4L, 2L, 7L, 6L, 8L, 4L), X22 = c(6L, 9L, 7L, 5L, 5L, 3L, 5L, 4L, 3L, 4L, 6L, 3L), X23 = c(4L, 10L, 5L, 5L, 7L, 1L, 2L, 2L, 2L, 1L, 1L, 4L), X24 = c(5L, 11L, 3L, 7L, 4L, 7L, 1L, 1L, 3L, 1L, 7L, 3L), X25 = c(3L, 8L, 11L, 2L, 6L, 9L, 3L, 2L, 2L, 2L, 6L, 10L), X26 = c(3L, 9L, 8L, 7L, 7L, 8L, 7L, 0L, 3L, 3L, 3L, 2L), X27 = c(15L, 13L, 6L, 4L, 7L, 4L, 4L, 1L, 4L, 5L, 9L, 6L), X28 = c(10L, 7L, 4L, 5L, 6L, 3L, 4L, 4L, 1L, 4L, 9L, 4L), X29 = c(2L, 0L, 5L, 10L, 6L, 2L, 6L, 2L, 2L, 6L, 2L, 5L), X30 = c(4L, 0L, 1L, 10L, 9L, 9L, 4L, 4L, 6L, 4L, 8L, 7L), X31 = c(12L, 0L, 8L, 0L, 2L, 0L, 5L, 1L, 0L, 4L, 0L, 3L)), class = "data.frame", row.names = c(NA, -12L)) # 转换为长格式并生成有效日期 long_df <- sample_df %>% mutate(Month = 1:12) %>% # 每行对应1-12月 tidyr::pivot_longer(cols = starts_with("X"), names_to = "Day", values_to = "New_Accounts") %>% mutate(Day = as.numeric(gsub("X", "", Day))) %>% # 移除Day列的前缀X,转为数字 mutate(Date = as.Date(paste(2021, Month, Day, sep = "-"))) %>% # 生成完整日期 filter(!is.na(Date)) # 过滤无效日期(如2月31号、4月31号等)
针对JSON文件的处理
相关产品推荐
相关产品推荐

