【问题标题】:ggplot - Graphing items from a list without for loopsggplot - 从没有 for 循环的列表中绘制项目
【发布时间】:2018-12-16 10:42:06
【问题描述】:

我正在尝试从如下所示的列表中绘制一些图表:

rs1 <- data.frame(c("A1", "A2", "A3", "A4", "A5"), runif(5), runif(5), runif(5))
names(rs1) <- c("column", 2007, 2008, 2009)
rownames(rs1) <- rs1$column
rs1 <- rs1[2:4]

rs2 <- data.frame(c("A1", "A2", "A3", "A4", "A5"), runif(5), runif(5), runif(5))
names(rs2) <- c("column", 2007,2008,2009)
rownames(rs2) <- rs2$column
rs2 <- rs2[2:4]


l1 <- list(rs1, rs2)
names(l1) <- c("CompanyA", "CompanyB")
l1

$CompanyA
        2007      2008      2009
A1 0.6486099 0.5310441 0.7095210
A2 0.3881914 0.2394723 0.6997068
A3 0.4295121 0.6618062 0.2725275
A4 0.6548886 0.3708362 0.3510994
A5 0.3825162 0.7545498 0.3470293

$CompanyB
         2007       2008       2009
A1 0.96786369 0.95582327 0.12709719
A2 0.69906099 0.22706448 0.47463029
A3 0.67795904 0.07207512 0.07862240
A4 0.09535442 0.74312544 0.19818115
A5 0.36331461 0.98673541 0.07754267

我想为列表中的每个项目(即每个公司)绘制如下图,例如公司 A 的图如下所示:

compA <- l1[['CompanyA']]

compA      <- as.data.frame(t(compA))
compA$year <- rownames(compA)
compA      <- melt(compA, id.vars=c("year"))

ggplot(compA, aes(x=as.numeric(year), y=value, color=variable)) + geom_line()

现在我可以创建一个 for 循环来遍历列表的每个元素并创建如上图。但是,我的实际数据集有数千家公司,因此我理想情况下希望创建一个数据集,该数据集可用于为每个公司绘制上述所需数据。

任何帮助表示赞赏。

编辑: 我有以下几点:

main.df <- data.frame()
for (nm in names(l1)){
  df <- l1[[nm]]
  df      <- as.data.frame(t(df))
  df$year <- rownames(df)
  df <- melt(df, id.vars=c("year"))
  df$Company <- nm
  main.df <- rbind(df, main.df)
}

ggplot(data = main.df) +
  geom_smooth(mapping = aes(x=as.numeric(year), y = value, color = variable)) 

但是我在绘图时遇到这些错误:

predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x else if (is.data.frame(newdata)) 中的警告 as.matrix(model.frame(delete.response(terms(object)), : 还有其他近奇点。 1.0201

任何帮助表示赞赏

【问题讨论】:

    标签: r list ggplot2


    【解决方案1】:

    您可以首先使用列名和行名从列表中创建一个data.frame,然后将其重新调整为长格式。然后使用facet_grid() 可以得到这两个图。

    l1[[1]][4] <- names(l1)[1]
    l1[[1]][5] <- rownames(l1[[1]])
    l1[[2]][4] <- names(l1)[2]
    l1[[2]][5] <- rownames(l1[[2]])
    
    df1 <- do.call(rbind, l1)
    rownames(df1) <- NULL
    names(df1)[4:5] <- c("company", "column")
    
    df1 <- reshape(df1, direction = "long", varying = list(names(df1)[1:3]), v.names = "value", 
            idvar = c("company", "column"), timevar = "year", times=names(df1[1:3]))
    

    屈服 df1

    > head(df1, 10)
                      company column year      value
    CompanyA.A1.2007 CompanyA     A1 2007 0.19281213
    CompanyA.A2.2007 CompanyA     A2 2007 0.05178135
    CompanyA.A3.2007 CompanyA     A3 2007 0.15578975
    CompanyA.A4.2007 CompanyA     A4 2007 0.70182986
    CompanyA.A5.2007 CompanyA     A5 2007 0.94615300
    CompanyB.A1.2007 CompanyB     A1 2007 0.19962672
    CompanyB.A2.2007 CompanyB     A2 2007 0.14236462
    CompanyB.A3.2007 CompanyB     A3 2007 0.60083513
    CompanyB.A4.2007 CompanyB     A4 2007 0.47985951
    CompanyB.A5.2007 CompanyB     A5 2007 0.02689391
    

    情节

    ggplot(df1, aes(x=as.factor(year), y=value, color=column, group=column)) +
      geom_line() +
      labs(x="Year") +
      facet_grid(company ~ .) +
      scale_x_discrete(expand=c(.1, .1))
    

    数据

    setseed(42)
    rs1 <- data.frame(c("A1", "A2", "A3", "A4", "A5"), runif(5), runif(5), runif(5))
    names(rs1) <- c("column", 2007, 2008, 2009)
    rownames(rs1) <- rs1$column
    rs1 <- rs1[2:4]
    
    rs2 <- data.frame(c("A1", "A2", "A3", "A4", "A5"), runif(5), runif(5), runif(5))
    names(rs2) <- c("column", 2007, 2008, 2009)
    rownames(rs2) <- rs2$column
    rs2 <- rs2[2:4]
    
    l1 <- list(rs1, rs2)
    

    【讨论】:

    • 谢谢 - 但岁月似乎不见了!我已经设法让他们重新编辑你的代码,但他们显示 0.5 等 - 你知道如何删除这些吗?例如2006.5在规模
    • @user33484 请看我的编辑,我已经相应地更新了代码。
    猜你喜欢
    • 1970-01-01
    • 2020-12-07
    • 2013-11-08
    • 2023-03-03
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    相关资源
    最近更新 更多