Как выровнять столбцы графика из нескольких фреймов данных в R? - PullRequest
0 голосов
/ 31 октября 2019

Думал, что это будет легко, но у меня заканчиваются идеи здесь. У меня есть три data.frame, которые я хотел бы изобразить на одной фигуре так, чтобы график-A содержал линейные графики, используя данные column A от всех data.frame, то есть DF1,DF2,DF3, график-B должен содержать линейные графикииспользуя данные column B из всех data.frame и аналогично для C. В прошлом я использовал facet_wrap, однако я понятия не имею, как это сделать. Вот мой простой код, который не создает сюжета, но дает представление о том, чего я хочу. Опция ggplot была бы хороша.

library(gridExtra)

DF1 = data.frame(Month = 1:12, A = runif(12, 1,10), B = runif(12,5,10), C = runif(12, 3,9))
DF2 = data.frame(Month = 1:12, A = runif(12, 4,13), B = runif(12,6,14), C = runif(12, 3,12))
DF3 = data.frame(Month = 1:12, A = runif(12, 2,15), B = runif(12,1,9), C = runif(12, 3,15))

G1 = plot(DF1$Month, y=DF1$A, "l")
lines(DF2$A, col = "red")
lines(DF3$A, col = "blue")

G2 = plot(DF1$Month, y=DF1$B, "l")
lines(DF2$B, col = "red")
lines(DF3$B, col = "blue")

G3 = plot(DF1$Month, y=DF1$C, "l")
lines(DF2$C, col = "red")
lines(DF3$C, col = "blue")

grid.arrange(G1,G2,G3, ncol = 3)

Примечание: * В моем примере у меня есть три столбца в каждом data.frame, однако я хотел бы применить код поверхdata.frame, которые имеют большое количество столбцов, а не только три. так что автоматизация процесса помогла бы.

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Вот так

Единственный шаг вручную - дать каждому data.frame идентифицирующий столбец (возможно, автоматизировать с помощью этого? Добавить столбец, содержащий имя фрейма данных, в список фреймов данных )

Затем вы объединяете их все в один фрейм данных и gather столбцы, чтобы data.frame был в полной форме. Затем вы можете использовать с facet_grid / facet_wrap, как вы упомянули

DF1 = data.frame(Month = 1:12, A = runif(12, 1,10), B = runif(12,5,10), C = runif(12, 3,9))
DF2 = data.frame(Month = 1:12, A = runif(12, 4,13), B = runif(12,6,14), C = runif(12, 3,12))
DF3 = data.frame(Month = 1:12, A = runif(12, 2,15), B = runif(12,1,9), C = runif(12, 3,15))


DF1$df <- "1"
DF2$df <- "2"
DF3$df <- "3"

library(tidyr)
library(ggplot2)
AllDf <- rbind(DF1,DF2,DF3)

AllDf_l <- AllDf %>% gather(Var,Value, A:C)

ggplot(AllDf_l, aes(x = Month, y = Value, colour = df))+geom_line()+
  facet_grid(Var~.)
2 голосов
/ 31 октября 2019

Использование:

par(mfrow=c(1,3))

DF1 = data.frame(Month = 1:12, A = runif(12, 1,10), B = runif(12,5,10), C = runif(12, 3,9))
DF2 = data.frame(Month = 1:12, A = runif(12, 4,13), B = runif(12,6,14), C = runif(12, 3,12))
DF3 = data.frame(Month = 1:12, A = runif(12, 2,15), B = runif(12,1,9), C = runif(12, 3,15))

plot(DF1$Month, y=DF1$A, "l")
lines(DF2$A, col = "red")
lines(DF3$A, col = "blue")

plot(DF1$Month, y=DF1$B, "l")
lines(DF2$B, col = "red")
lines(DF3$B, col = "blue")

plot(DF1$Month, y=DF1$C, "l")
lines(DF2$C, col = "red")
lines(DF3$C, col = "blue")

Вы можете сбросить область построения обратно на 1 x 1 с помощью dev.off()

РЕДАКТИРОВАТЬ: решение ggplot будет:

library(ggplot2)
library(gridExtra)
p1 <- ggplot(NULL)+
  geom_line(data = DF1,aes(x=Month,y=A),color="black")+
  geom_line(data = DF2,aes(x=Month,y=A),color="red")+
  geom_line(data = DF3,aes(x=Month,y=A),color="blue")

p2 <- ggplot(NULL)+
  geom_line(data = DF1,aes(x=Month,y=B),color="black")+
  geom_line(data = DF2,aes(x=Month,y=B),color="red")+
  geom_line(data = DF3,aes(x=Month,y=B),color="blue")

p3 <- ggplot(NULL)+
  geom_line(data = DF1,aes(x=Month,y=C),color="black")+
  geom_line(data = DF2,aes(x=Month,y=C),color="red")+
  geom_line(data = DF3,aes(x=Month,y=C),color="blue")

grid.arrange(p1,p2,p3,nrow=1)
...