基于R中的表值更新图形
我正在R中运行一个代码,它有几个迭代。每个结果都存储在一个名为accatable的表中。如您所见,在下面的示例中,只有行S2*的结果 我要创建的是一个使用ggplot2显示演变的图形。例如,运行第一次迭代并获取第S2行*第1列的值。然后在第二次迭代中,您将获得第S2行*第2列的值,以此类推 目标是在每次迭代后绘制一个图形,该图形将在每次更新时显示演变 到目前为止,我已经成功地创建了该图,但只有当所有的表都完成时。这是我试过的测试。我首先创建df并将其从宽格式转换为长格式。然后我使用ggplot将输出装箱基于R中的表值更新图形,r,dataframe,plot,ggplot2,R,Dataframe,Plot,Ggplot2,我正在R中运行一个代码,它有几个迭代。每个结果都存储在一个名为accatable的表中。如您所见,在下面的示例中,只有行S2*的结果 我要创建的是一个使用ggplot2显示演变的图形。例如,运行第一次迭代并获取第S2行*第1列的值。然后在第二次迭代中,您将获得第S2行*第2列的值,以此类推 目标是在每次迭代后绘制一个图形,该图形将在每次更新时显示演变 到目前为止,我已经成功地创建了该图,但只有当所有的表都完成时。这是我试过的测试。我首先创建df并将其从宽格式转换为长格式。然后我使用ggplot将
testdf <- replicate(7, sample(0:10,5,rep=TRUE))
colnames(testdf) <- as.character(seq(1,7))
rownames(testdf) <- c("S1", "S2", "S1_S2", "S2*", "S1_S2*")
test <- melt(testdf, id.vars=testdf[[1]])
colnames(test) <- c("Input", "Images", "Acca")
test
test$IMAGES <- as.numeric(as.vector(test$Images))
ggplot (data = test, aes(x=Images, y=Acca, group=Input, colour=Input)) +
geom_line(aes(linetype=Input)) +
geom_point() +
scale_colour_manual(name="Scenario",
values = c("black","black","blue","blue","red","red",
"darkgreen","darkgreen")) +
scale_linetype_manual(name="Scenario",
values=c("solid","dashed","solid","dashed","solid", "dashed",
"solid","dashed","solid","dashed", "solid","dashed")) +
theme_minimal() +
labs(x="Images", y="Acca",title="test") +
theme(plot.title = element_text(hjust = 0.5)) +
scale_x_continuous("Images", c(1,2,3,4,5,6,7), c(1,2,3,4,5,6,7))
你知道如何在每次添加新值时调整ggplot代码来绘制表格吗?这里有一个tidyverse解决方案
为了说明这一点,我创建了一个与testdf大小相同的空白数据框,以进行迭代更新:
testdf <- as.data.frame(testdf)
accatable <- data.frame(`1` = rep(NA, 5), `2` = rep(NA, 5),
`3` = rep(NA, 5), `4` = rep(NA, 5),
`5` = rep(NA, 5), `6` = rep(NA, 5),
`7` = rep(NA, 5),
row.names = rownames(testdf))
> accatable
X1 X2 X3 X4 X5 X6 X7
S1 NA NA NA NA NA NA NA
S2 NA NA NA NA NA NA NA
S1_S2 NA NA NA NA NA NA NA
S2* NA NA NA NA NA NA NA
S1_S2* NA NA NA NA NA NA NA
结果如下所示:
我在示例代码中省略了scale_XX规范,因为我认为它们对解决方案不是必需的。您可以根据需要调整外观。感谢您的解决方案。我以您的代码为灵感管理了一个变通解决方案
testdf <- as.data.frame(testdf)
accatable <- data.frame(`1` = rep(NA, 5), `2` = rep(NA, 5),
`3` = rep(NA, 5), `4` = rep(NA, 5),
`5` = rep(NA, 5), `6` = rep(NA, 5),
`7` = rep(NA, 5),
row.names = rownames(testdf))
> accatable
X1 X2 X3 X4 X5 X6 X7
S1 NA NA NA NA NA NA NA
S2 NA NA NA NA NA NA NA
S1_S2 NA NA NA NA NA NA NA
S2* NA NA NA NA NA NA NA
S1_S2* NA NA NA NA NA NA NA
library(dplyr)
p.list <- vector("list", ncol(accatable))
for(i in seq_along(accatable)){
accatable[, i] <- testdf[, i] # replace with your actual updating code
p <- ggplot(accatable[, seq(1, i), drop = FALSE] %>% # keep only first 1-i columns
tibble::rownames_to_column(var = "Scenario") %>% # add row name as a column
tidyr::gather(iteration, value, -Scenario), # convert to long format
aes(x = iteration, y = value, group = Scenario,
color = Scenario, linetype = Scenario)) +
geom_line() +
geom_point() +
labs(x = "Images", y = "ACCA", title = paste("Iteration:", i)) +
theme_minimal()
print(p) # if you just want to SEE the result from each iteration
p.list[[i]] <- ggplotGrob(p) # if you want to SAVE the result from each iteration
}
gridExtra::grid.arrange(grobs = p.list, ncol = 1)