Использование функции вставки внутри ggplot в цикле - PullRequest
0 голосов
/ 22 января 2020

Проблема: у меня есть три кадра данных, "d1", "d2" и "d3", имеющие три строки, X1, X2 и значение. Я хочу построить несколько линий, используя X2 в качестве индекса. Я хочу создать al oop, который делает то же самое для каждого кадра данных. Код должен работать с любым фреймом данных.

Мой код

for (i in 1:3){
p<-as.name(paste("d", i, sep = ""))%>%
 ggplot(aes(x=X1, y=value, colour=as.factor(X2)))+
  labs(title =paste("Plot", i, sep =" "), x = "X axis", y = "value")+
  geom_line()+
  theme(legend.position="none")+
  theme_classic2()
assign(paste("p", i, sep =""), p)
  }

Функция работает из l oop, но когда я запускаю l oop, я получаю ошибку:

Error: `data` must be a data frame, or other object coercible by `fortify()`, not a character vector

Когда я попробовал, была возвращена та же ошибка:

for (i in 1:3){
p<- ggplot(as.name(paste("d", i, sep = "")), aes(x=X1, y=value, colour=as.factor(X2)))+
  labs(title =paste("Plot", i, sep =" "), x = "X axis", y = "value")+
  geom_line()+
  theme(legend.position="none")+
  theme_classic2()
assign(paste("p", i, sep =""), p)
  }

Я не смог найти ответ в SO.

Я думаю, что он мог чем-то заняться с paste() внутри l oop.

Надеюсь, кто-то может помочь.

1 Ответ

1 голос
/ 22 января 2020

Я не уверен, что вы спрашиваете, и является ли этот маршрут способом go об этом. Если вы хотите сделать три сюжета, то петли - это один из способов. Если вы замените as.name на get, тогда оно должно работать:

d1 <- tibble(a = 1:10, b = 1:10)
d2 <- tibble(a = 10:1, b = 1:10)
d3 <- tibble(a = 5, b = 1:10)

for (i in 1:3){

  p <- get(paste("d", i, sep = ""))%>%
    ggplot(aes(x=X1, y=value, colour=as.factor(X2)))+
    labs(title =paste("Plot", i, sep =" "), x = "X axis", y = "value")+
    geom_line()+
    theme(legend.position="none") +
    theme_classic2()
  assign(paste("p", i, sep =""), p)

}

Альтернативно, более простой способ сделать это - объединить кадры данных в итерируемый список:

l <- list(d1, d2, d3)

for (i in 1:3){
  p<-l[i][[1]]%>%
    ggplot(aes(x=a, y=b))+
    labs(title =paste("Plot", i, sep =" "), x = "X axis", y = "value")+
    geom_line()+
    theme(legend.position="none") +
    theme_classic2()
  assign(paste("p", i, sep =""), p)
}

Это будет перебирать три кадра данных и создавать графики. Я продемонстрировал здесь случайный фрейм данных - если это не сработает, то лучше опубликовать образец набора данных для дальнейших ответов, чтобы попробовать и использовать.

Однако , если Вы собираетесь построить три линии на одном графике, тогда было бы лучше объединить их в один кадр данных со значениями «X1», «X2» и «X3» в качестве столбца группировки. Но я не уверен, как ваши данные выглядят, чтобы сделать это. Вы можете опубликовать образец?

...