Given dataframes df1
and df2
as follows:
df1:
df1 <- structure(list(date = structure(c(1L, 2L, 4L, 5L, 6L, 7L, 8L,
9L, 10L, 11L, 3L), .Label = c("2021/1/31", "2021/2/1", "2021/2/10",
"2021/2/2", "2021/2/3", "2021/2/4", "2021/2/5", "2021/2/6", "2021/2/7",
"2021/2/8", "2021/2/9"), class = "factor"), value1 = c(9.76,
9.76, 9.88, 9.31, 9.71, 9.56, 9.27, 9.22, 9.21, 9.08, 8.78),
value2 = c(6.84, 6.88, 6.95, 6.65, 6.94, 6.85, 6.66, 6.66,
6.6, 6.5, 6.25), value3 = c(6.33, 6.21, 6.31, 6.2, 6.56,
6.36, 6.36, 6.25, 6.1, 6.02, 5.76), value4 = c(10.68, 10.91,
11, 10.49, 10.8, 10.5, 10.2, 9.85, 10.03, 9.8, 9.51), value5 = c(7.77,
7.84, 7.83, 7.44, 7.83, 7.77, 7.6, 7.46, 7.46, 7.39, 7.29
)), class = "data.frame", row.names = c(NA, -11L))
df2:
df2 <- structure(list(type = structure(c(2L, 2L, 3L, 3L, 1L), .Label = c("pct_change",
"price", "quantity"), class = "factor"), columns = structure(1:5, .Label = c("value1",
"value2", "value3", "value4", "value5"), class = "factor")), class = "data.frame", row.names = c(NA,
-5L))
Plot time series for df1
:
library(ggplot2)
library(data.table)
df1$date <- as.Date(df1$date)
df1.m <- melt(df1, id = "date") # convert to long format
ggplot(data = df1.m,
aes(x=date, y = value, colour=variable))
geom_line(size = 1, alpha = 1)
ggsave("df1.png")
Out:
Now I hope to loop all columns but based df2
, which means for each columns
, if its type
are identical, then plot them on same plot and finally save them with name of type
.
For dataset df1
, we will finally generate three plots: price.png
, quantity.png
and pct_change.png
.
How could I achieve that based on code above? Sincere thanks at advance.
CodePudding user response:
I think something like this should do what you want. (But for the moment I'm running into an error with ggsave which should be fixed given I'm using ggplot2 3.3.5?) Hopefully it works for others.
# add "type" variable to df1.m
df1.m2 = merge(df1.m, df2, by.x = "variable", by.y = "columns")
# for each "type", filter the data to that type, plot, and save
for(my_type in unique(df1.m2$type)) {
g <- ggplot(data = df1.m2[df1.m2$type == my_type,],
aes(x=date, y = value, colour=variable))
geom_line(size = 1, alpha = 1)
ggsave(paste0(my_type,".png"))
}