首页 > 解决方案 > 更改脚本以使用数据文件名/变量列表?

问题描述

我一直在使用这个模板脚本来加载和绘制数据:

library("ggplot2")
library("scales")
library("zoo")
library("lubridate")
library("grid")
library("gridExtra")
library("gtable")
library("labeling")

Template.sum.plot <- read.csv("F:/br/RF/Template_SK.csv", header=TRUE, sep=",", dec=".", quote="")
Template.sum.plot$Template_SK.SUM=rowSums(Template.sum.plot[,-1])
Template.sum.plot$date.hour <- ymd_hms(Template.sum.plot$filenames)
Template.sum.plot<-as.data.frame(Template.sum.plot)

Template_Total.SK.Data.Table.plotted <- ggplot(data=Template.sum.plot, aes(x=date.hour, y=Template_SK.SUM)) + geom_line(color="blue") + scale_y_continuous(labels=comma) + scale_x_datetime(position="top", labels=date_format("%F"), date_breaks="1 month") + theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5, size = 12, margin=margin(0,0,10,0)), panel.background=element_rect(fill='white'), panel.grid.major = element_line(colour = "black", linetype=3), panel.grid.minor = element_blank(), axis.ticks.x=element_blank()) + labs(x=(paste("4WRM, ",(format(Template.sum.plot$date.hour[1], '%Y-%m-%d %T %Z'))," to ",(Template.sum.plot$date.hour[(nrow(Template.sum.plot))]))) , y="PPM\n") + ggtitle("Template PON") + geom_vline(xintercept=as.numeric(Template.sum.plot$date.hour[(which(Template.sum.plot$date.hour == paste("2019-07-12 06:00:00")))]), linetype=2, color="red") + geom_vline(xintercept=as.numeric(Template.sum.plot$date.hour[(which(Template.sum.plot$date.hour == paste("2019-09-16 06:00:00")))]), linetype=2, color="red") + geom_line(aes(y = rollmean(Template_SK.SUM, 336, na.pad=TRUE)), color = "#111111")

png(filename="F:/br/Template.SK.Data.Table.plot.png", width=30, height=5, units="in", res=600)
grobz <- lapply(list(Template_Total.SK.Data.Table.plotted), ggplotGrob)
grobz.plot <- arrangeGrob( grobs = list(rbind(grobz[[1]], size = "last")), ncol = 1)
grid.draw(grobz.plot)
dev.off()

我一直在手动搜索/替换“模板”到“XXF”和“XXGF”,然后运行我的脚本直到现在,但我想知道我是否可以制作一个列表(例如list_data <- list(c("XXF","XXGF","XXGT"))并将每次出现的“模板”交换为列出名字?

标签: r

解决方案


你可以写一个函数 -

read_and_plot <- function(filename) {
  
Template.sum.plot <- read.csv(filename, header=TRUE, sep=",", dec=".", quote="")
Template.sum.plot$Template_SK.SUM=rowSums(Template.sum.plot[,-1])
Template.sum.plot$date.hour <- ymd_hms(Template.sum.plot$filenames)
Template.sum.plot<-as.data.frame(Template.sum.plot)

Template_Total.SK.Data.Table.plotted <- ggplot(data=Template.sum.plot, 
                                               aes(x=date.hour, y=Template_SK.SUM)) + 
  geom_line(color="blue") + scale_y_continuous(labels=comma) + 
  scale_x_datetime(position="top", labels=date_format("%F"), date_breaks="1 month") + 
  theme(axis.title.x=element_blank(), 
        plot.title = element_text(hjust = 0.5, size = 12, margin=margin(0,0,10,0)), 
        panel.background=element_rect(fill='white'), 
        panel.grid.major = element_line(colour = "black", linetype=3), 
        panel.grid.minor = element_blank(), axis.ticks.x=element_blank()) + 
  labs(x=(paste("4WRM, ", (format(Template.sum.plot$date.hour[1], '%Y-%m-%d %T %Z'))," to ",(Template.sum.plot$date.hour[(nrow(Template.sum.plot))]))) , y="PPM\n") + 
  ggtitle("Template PON") + 
  geom_vline(xintercept=as.numeric(Template.sum.plot$date.hour[(which(Template.sum.plot$date.hour == paste("2019-07-12 06:00:00")))]), linetype=2, color="red") + geom_vline(xintercept=as.numeric(Template.sum.plot$date.hour[(which(Template.sum.plot$date.hour == paste("2019-09-16 06:00:00")))]), linetype=2, color="red") + 
  geom_line(aes(y = rollmean(Template_SK.SUM, 336, na.pad=TRUE)), color = "#111111")

png(filename= paste(dirname(filename), sub('csv', 'png', basename(filename)), sep = '/'), width=30, height=5, units="in", res=600)
grobz <- ggplotGrob(Template_Total.SK.Data.Table.plotted)
grobz.plot <- arrangeGrob(grobs = list(rbind(grobz, size = "last")), ncol = 1)
grid.draw(grobz.plot)
dev.off()

}

并将其应用于目录中的每个 csv 文件 -

all_files <- list.files('F:/br/RF/', pattern = '\\.csv$', full.names = TRUE)
lapply(all_files, read_and_plot)

请注意,我删除lapplygrobz <- lapply(list(Template_Total.SK.Data.Table.plotted), ggplotGrob)因为Template_Total.SK.Data.Table.plotted只是一个情节。也因为这下一行不需要grobz[[1]],只使用grobz就足够了。


推荐阅读