2017-02-14 2 views
1

У меня есть список data.frames:сюжетных линий в ggplot из списка dataframes

samplelist = list(a = data.frame(x = c(1:10), y=rnorm(10), 
       b= data.frame(x=c(5:10), y = rnorm(5), 
       c = data.frame(x=c(2:12), y=rnorm(10)) 

я хотел бы структурировать ggplot в следующем формате:

ggplot()+ 
    geom_line(data=samplelist[[1]], aes(x,y))+ 
    geom_line(data=samplelist[[2]], aes(x,y))+ 
    geom_line(data=samplelist[[3]], aes(x,y)) 

Но что не супер автоматизирован. Есть ли у кого-нибудь предложение, как это решить?

Спасибо!

+2

FYI, ваш 'samplelist' код имеет несколько errrors. – eipi10

ответ

6

ggplot работает наиболее эффективно с данными в «длинном» формате. В этом случае это означает, что ваши три фрейма данных объединяются в один кадр данных с добавленным дополнительным столбцом для идентификации кадра исходных данных. В этом формате вам нужен только один вызов geom_line, а новый столбец, определяющий исходный кадр данных, можно использовать в качестве цветовой эстетики, в результате чего создается другая строка для каждого исходного кадра данных. Функция dplyrbind_rows позволяет стекировать кадры данных «на лету», в пределах вызова ggplot.

library(dplyr) 
library(ggplot2) 

samplelist = list(a = data.frame(x=c(1:10), y=rnorm(10)), 
        b = data.frame(x=c(5:10), y=rnorm(6)), 
        c = data.frame(x=c(2:12), y=rnorm(11))) 

ggplot(bind_rows(samplelist, .id="df"), aes(x, y, colour=df)) + 
    geom_line() 

enter image description here

Я предположил выше, что вы хотели бы каждая строка быть разного цвета и там быть легенда, показывающая отображение цвета. Однако, если по какой-то причине вам просто нужны три черные линии и никаких легенд, просто измените colour=df на group=df.

3

Это будет работать -

library(ggplot2) 
samplelist <- list(a = data.frame(x = c(1:10), y=rnorm(10)), 
        b = data.frame(x=c(5:10), y = rnorm(6)), 
        c = data.frame(x=c(2:12), y=rnorm(11))) 

p <- ggplot() 
for (i in 1:3) p <- p + geom_line(data=samplelist[[i]], aes(x,y)) 
p 
+0

Ваше предложение об использовании 'i' в' aes() 'будет терпеть неудачу – baptiste

+0

Хорошая точка, все они должны быть в одном и том же формате, чтобы использовать это. отредактировано соответственно – Craig

2

Или вы могли бы использовать lapply.

library(ggplot2) 

samplelist = list(a = data.frame(x = c(1:10), y=rnorm(10)), 
        b= data.frame(x=c(5:10), y = rnorm(6)), 
        c = data.frame(x=c(2:12), y=rnorm(11))) 

p <- ggplot() 

plot <- function(df){ 
    p <<- p + geom_line(data=df, aes(x,y)) 
} 

lapply(samplelist, plot) 

p 
+0

с использованием '<< -', часто не является лучшей стратегией в R (обычно потому, что предпочитают избегать побочных эффектов в нелокальных средах); Я думаю, что 'Reduce()' здесь более идиоматично. – baptiste

+0

Хороший совет - спасибо. – LuckySeedling

1

Уменьшить другой вариант, чтобы добавить вещи итеративно,

library(ggplot2) 

samplelist = list(a = data.frame(x = c(1:10), y=rnorm(10)), 
        b= data.frame(x=c(5:10), y = rnorm(6)), 
        c = data.frame(x=c(2:12), y=rnorm(11))) 

pl <- Reduce(f = function(p, d) p + geom_line(data=d, aes(x,y)), 
      x = samplelist, init = ggplot(), accumulate = TRUE) 

gridExtra::grid.arrange(grobs = pl) 

enter image description here

Смежные вопросы