Обновить график на основе значений таблицы в R - PullRequest
0 голосов
/ 16 мая 2018

Я выполняю код на R, который имеет несколько итераций. Результат каждого из них сохраняется в таблице с именем accatable. Как вы можете видеть, в этом примере ниже есть только результат для строки S2*

> accatable
              1         2        3         4         5         6        7
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*    0.737714 0.7083141 0.767515 0.8060774 0.7800401 0.8015116 0.815209
S1_S2*       NA        NA       NA        NA        NA        NA       NA

Я хочу создать график, использующий ggplot2, показывающий эволюцию. Например, вы запускаете первую итерацию и получаете значение для строки S2* column 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 для построения таблицы каждый раз, когда добавляется новое значение?

1 Ответ

0 голосов
/ 16 мая 2018

Вот решение 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

Предполагается, что для цикла i в цикле for столбец i фрейма данных обновляется:

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)

Результат выглядит примерно так:

plot

(я исключил спецификации scale_XX() из примера кода, так как я не думаю, что они необходимы для решения. Вы можете настроить внешний вид и ощущения по мере необходимости.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...