r - ggplot - 从没有 for 循环的列表中绘制项目
问题描述
我正在尝试从如下所示的列表中绘制一些图表:
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
任何帮助表示赞赏
解决方案
您可以首先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)
推荐阅读
- sql - SQL Server 数据透视查询 - 问题
- html - 为什么我的网站上不应该有滚动条?
- javascript - 如何通过此文本框将多行添加到不同的 div / span 标签中?
- javascript - 在单独的文件中更改文本区域的颜色
- android - 从 PC 上的平板电脑/手机输入
- java - 根据应用主题(Android)更改底部导航颜色的选定图标颜色
- python - 如何使 LabelFrame 的框架不可见?(Tkinter)
- java - 按 ESC 而不选择元素 selenium java
- android - Android 从图库或谷歌照片中获取实际文件路径
- android - 通过传递布局 id 避免手动膨胀布局