如何使用split和sapply在ggplot中合并多个数据源?

问题描述

此问题与@Rui Barradas和@Duck回答的上一个问题有关,但我需要更多帮助。上一个链接在这里: how do i vectorise (automate) plot creation in R

基本上,我需要将3个数据集合并到一个具有次要y轴的绘图中。所有数据集都需要按SITENAME进行拆分,并按Sampling.Year进行分面包装。我正在使用split和sapply。多面包裹情节看起来像这样:

enter image description here

但是,我现在正尝试将其他两个数据源添加到图中,看起来像这样:

enter image description here

但我正在努力添加其他两个数据源,并按SITENAME对其进行拆分。到目前为止,她是我的密码...

将绘图格式记录为要应用于拆分列表df的函数(理想情况下,“ df”将作为带有辅助y轴的geom_line添加,而“ FF_start_dates”将作为垂直虚线添加):

SITENAME_plot <- function(AllDates_TPAF){
  ggplot(AllDates_TPAF,aes(DATE,Daily.Ave.PAF)) +
    geom_point(aes(colour = Risk),size = 3) +
     scale_colour_manual(values=c("Very Low" = "dark green","Low" = "light green","Moderate" = "yellow","High" = "orange","Very High" = "red"),drop = FALSE) +
     labs(x = "Month",y = "Total PAF (% affected)") +
            scale_x_date(breaks = "1 month",labels = scales::date_format("%B")) +
        facet_wrap(~Sampling.Year,ncol = 1,scales = "free")+
    scale_y_continuous(limits = c(0,100),sec.axis = sec_axis(~.,name = "Water level (m)")) +
    theme(axis.text.x = element_text(angle = 90,vjust = 0.5,hjust = 1)) +
    theme(legend.text=element_text(size=15)) +
    theme(axis.text=element_text(size=15),axis.title=element_text(size=15,face="bold")) +
    guides(color = guide_legend(reverse = TRUE))+
    theme_bw() +
    ggtitle(unique(AllDates_TPAF$SITENAME))
}

绘图写功能:

SITENAME_plot_write <- function(name,g,dir = "N:/abc/"){
  flname <- file.path(dir,name)
  flname <- paste0(flname,".jpg")
  png(filename = flname,width = 1500,height = 1000)
  print(g)
  dev.off()
  flname
}

将函数应用于按SITENAME划分的列表:

sp1 <- split(AllDates_TPAF,AllDates_TPAF$SITENAME)
gg_list <- sapply(sp1,SITENAME_plot,simplify = FALSE)
mapply(SITENAME_plot_write,names(gg_list),gg_list,MoreArgs = list(dir = getwd()))
dev.off()

我在这里上传了所有3个数据集的样本:Sample Data

对不使用gsub但数据太多的致歉,我无法使其正常工作

即使您只是将我引向某种网络教程,也要感谢您能提供的任何帮助。

解决方法

您可以尝试下一个代码。我使用了您共享的数据。请注意所有数据集的名称。理想情况下,在进行拆分之前,关键列string = "(foo(bar))" print(string.find(")")) num = string.count(")") a = 0 b = 0 dict_ = {"open": [],"close": []} a = string.find("(",a) dict_["open"].append(a) for _ in range(0,num): a = string.find("(",a+1) dict_["open"].append(a) b = string.find(")",b+1) dict_["close"].append(b) dict_["open"].pop(-1) print(dict_) DATE应该出现在所有数据框中。还缺少一些Sampling.Year变量,因此我添加了一个具有相同名称的示例var。在这里的代码中,我为想要的绘图添加了一个函数:

Risk

您最终将获得保存在目录中的类似图:

enter image description here

enter image description here

某些虚线未出现在绘图中,因为它们不存在于您提供的数据中。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...