You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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文件的处理

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:53:13