使用两个不同大小的数据帧从 R Loop 中绘制

联合开发中心

我有 2 个不同大小的数据帧 - 一个大约 300 行,另一个大约 30 行。大小将根据选择的输入而变化。我已经成功构建了 R 代码,它将为每个输入绘制一个循环的输出,但我无法弄清楚如何将所有迭代放在一个图表上。有很多关于多图的文章,但到目前为止我还没有成功,即不同大小的数据框,在一张图表上绘制所有迭代(不同大小)(不是一页上的多个图表 - 一页上的一个图表) . 下面是用于生成单个图表的代码 - 我只是不知道如何将它们全部放在同一个图表上......

WellS <- rep(WellSelect[i], length(EW))
WellC <- rep(WellSelect[i], length(X))
dfSurvey <- data.frame(Well = WellS, MD = MD, EW = EW, NS = NS, TVD = TVD)
dfCalc <- data.frame(Well = WellC, Perf = P, X = X, Y = Y, TVDp = TVDp)

上面的代码将此处未显示的计算编译到数据框 dfSurvey 和 dfCalc 中。请注意,“WellSelect”是驱动计算原始数据输入的主要变量。可能有 2 到 4000 多个独特的“WellSelect”可能性,每个都有 2 个数据帧,大小与第一句中提到的一样 - 都是“WellSelect”独有的。除了提到的图表外,一切都有效。我试图绑定数据帧,但不知道如何在不同大小的 df 上进行绑定。

pname <- paste0(dfSurvey$Well[i])
p <- ggplot() + geom_point(data = dfSurvey, aes(x=EW, y=NS), shape = 2,    size = 2, color = "blue1") +
  geom_point(data = dfCalc, aes(x=X, y=Y), shape = 17, size = 5, color = "Chartreuse3") +
  ggtitle(pname)
ggsave(paste0(pname, ".png"), p)
print(p)

请注意,“dfSurvey”是较大的数据框,而“dfCalc”则较小。我很感激一些指导。

编辑以包括数据集和示例图:

这是我目前通过编码得到的情节:

每个“WellSelect”当前都会生成自己的图

这就是我想要实现的目标:

组合图,注意红色三角形代表“dfCalc”,实线代表“dfSurvey”

这些链接上有“DS”和“Perf”的缩写示例数据集:

DS(请注意,绘制的变量是 EW 与 NS): https : //drive.google.com/open?id=0B5pFHCTpv6BWTUh3MWJoaVhaT0kxZzJFVWJ4QTFaM0Q5S29j

性能: https ://drive.google.com/open ? id = 0B5pFHCTpv6BWMjhLZnF3Zk9mM0hZaXYxLWVKUlBnWXlPQ0xB

我已经包含了下面的代码的全部范围,这些代码应该使用上面的文件运行,最终是前面显示的单个图。代码效率不高,我知道,但我是新手,所以我现在只需要一些有用的东西。

library(ggplot2)

DS <- read.csv(file = "DirectionalSurveys.csv")
Perf <- read.csv(file = "Perforation.csv")

colnames(DS) <- c "IDWELL", "API", "WellName", "Division", "MD", "INCL", "AZIM", "NS", "EW", "TVD", "DLS")
colnames(Perf) <- c("IDWELL", "API", "WellName", "County", "MidPerfMD", "MidPerfTVD")

WellSelect <- c("LINDA GREATHOUSE BRK 1", "LINDA GREATHOUSE BRK 3", "LINDA GREATHOUSE BRK 5", "LINDA GREATHOUSE BRK 205",
            "BARRY GREATHOUSE A 5", "BARRY GREATHOUSE A 10", "BARRY GREATHOUSE B 3")

for(i in seq_along(WellSelect)) {

    S <- DS$MD[DS$WellName == WellSelect[i]]
    P <- Perf$MidPerfMD[Perf$WellName == WellSelect[i]]
    INCL <- DS$INCL[DS$WellName == WellSelect[i]]
    AZIM <- DS$AZIM[DS$WellName == WellSelect[i]]
    NS <- DS$NS[DS$WellName == WellSelect[i]]
    EW <- DS$EW[DS$WellName == WellSelect[i]]
    TVD <- DS$TVD[DS$WellName == WellSelect[i]]

    #Subset to get the survey depths deeper than "P"
    resultGT <- outer(S, P, '>=')
    resultGT[resultGT == FALSE] <- 50
    rownames(resultGT) <- paste0(S)
    colnames(resultGT) <- paste0("P=", P)
    minGT <- as.numeric(rownames(resultGT)[apply(resultGT , 2, which.min)])

    #P is mid-perf MD for each stage, Deep is Survey depth below P, Shallow is Survey depth above P

    deep <- S[match(minGT, S)]
    shallow <- S[match(minGT, S) - 1]

    #Subset "DS" to WellSelect
    Sub1 <- DS[DS$WellName == WellSelect[i], ]

    #Subset Sub1 to get the Survey data
    Sub2 <- Sub1[ , 5]

    #Match deep and shallow to the Survey depths to get location in DS
    deepRow <- match(deep, Sub2)
    shallowRow <- match (shallow, Sub2)

    #Pull the other data for deep and shallow from DS
    deepData <- Sub1[deepRow, ]
    shallowData <- Sub1[shallowRow, ]

    #Calculate Survey Variables

    AA29 <- 2*3.1416/360
    AY <- shallowData[ , "INCL"] + ((P - shallowData[ , "MD"]) / (shallowData[ , "MD"] - deepData[ , "MD"]) * (shallowData[ , "INCL"] - deepData[ , "INCL"] ))
    AZ <- shallowData[ , "AZIM"] + ((P - shallowData[ , "MD"]) / (shallowData[ , "MD"] - deepData[ , "MD"]) * (shallowData[ , "AZIM"] - deepData[ , "AZIM"] ))
    BA <- 0.000001 + acos(cos(AY * AA29 - shallowData[ , "INCL"] * AA29) - sin(shallowData[ , "INCL"] * AA29) * sin(AY * AA29) * (1 - cos(shallowData[ , "AZIM"] * AA29 - AZ * AA29)))
    BB <- 2 / BA * (tan(BA / 2))

    ##NOTE:  "X" and "Y" below are the plotted variables for the red triangles shown on the plots previously##

    Y <- (P - shallowData[ , "MD"]) * ((sin(AY * AA29) * cos(AZ * AA29)) + (sin(shallowData[ , "INCL"] * AA29) * cos(shallowData[ , "AZIM"] * AA29))) / 2 * BB + shallowData[ , "NS"]
    X <- (P - shallowData[ , "MD"]) * ((sin(AY * AA29) * sin(AZ * AA29)) + (sin(shallowData[ , "INCL"] * AA29) * sin(shallowData[ , "AZIM"] * AA29))) / 2 * BB + shallowData[ , "EW"]
    TVDp <- (P - shallowData[ , "MD"]) * (cos(AY * AA29) + cos(shallowData[ , "INCL"] * AA29)) / 2 * BB + shallowData[ , "TVD"]

    #***********************************************************#
    #Calculations all done, now on to the graphing process......#
    #***********************************************************#

    #fill in "WellSelect to match length of dataframe
    WellS <- rep(WellSelect[i], length(EW))
    WellC <- rep(WellSelect[i], length(X))

    #build dataframes for plots        
    dfSurvey <- data.frame(Well = WellS, MD = S, EW = EW, NS = NS, TVD = TVD)
    dfCalc <- data.frame(Well = WellC, Perf = P, X = X, Y = Y, TVDp = TVDp)
    dfSurvey <- dfSurvey[order(dfSurvey$Well, dfSurvey$MD), ]
    dfCalc <- dfCalc[order(dfCalc$Well, dfCalc$Perf), ]

    ###WORKS!!!! but just coded to save each plot and not combine
    pname <- paste0(dfSurvey$Well[i])
    p <- ggplot() + geom_point(data = dfSurvey, aes(x=EW, y=NS), shape = 2, size = 2, color = "blue1") +
    geom_point(data = dfCalc, aes(x=X, y=Y), shape = 17, size = 5, color = "Chartreuse3") + ggtitle(pname)
    ggsave(paste0(pname, ".png"), p)
    print(p)
}

希望这是有用的。如果您需要其他任何东西,请告诉我。谢谢您的帮助!

完美的

考虑将所有数据帧绑定到一个已编译的单一数据帧中,并使用以下的颜色参数ggplot

具体替换for循环:

for(i in seq_along(WellSelect)) {
    ...
}

使用 anlapply来构建数据框列表并删除所有绘图线(稍后完成):

df_lists <- lapply(seq_along(WellSelect), function(i) {
    # ... same code

    # build dataframes for plots        
    dfSurvey <- data.frame(Well = WellS, MD = S, EW = EW, NS = NS, TVD = TVD)
    dfCalc <- data.frame(Well = WellC, Perf = P, X = X, Y = Y, TVDp = TVDp)
    dfSurvey <- dfSurvey[order(dfSurvey$Well, dfSurvey$MD), ]
    dfCalc <- dfCalc[order(dfCalc$Well, dfCalc$Perf), ]

    return(list(dfSurvey, dfCalc))   
}

# COMPILED DATAFRAMES
dfSurveyAll <- do.call(rbind, lapply(df_lists, "[[", 1))

dfCalcAll <- do.call(rbind, lapply(df_lists, "[[", 2))

然后使用groupcolor参数运行一个奇异图

p <- ggplot() + 
       geom_point(data = dfSurveyAll, aes(x=EW, y=NS, group="Well", colour="Well"), 
                 shape = 2, size = 2) +
       geom_point(data = dfCalcAll, aes(x=X, y=Y,  group="Well", colour="Well"), 
                  shape = 17, size = 5) + ggtitle(pname)    
p

by当您通过WellName因子DS数据进行子集化时,甚至还有使用空间所以在for循环内的块下面

for(i in seq_along(WellSelect)) {
    S <- DS$MD[DS$WellName == WellSelect[i]]
    P <- Perf$MidPerfMD[Perf$WellName == WellSelect[i]]
    INCL <- DS$INCL[DS$WellName == WellSelect[i]]
    AZIM <- DS$AZIM[DS$WellName == WellSelect[i]]
    NS <- DS$NS[DS$WellName == WellSelect[i]]
    EW <- DS$EW[DS$WellName == WellSelect[i]]
    TVD <- DS$TVD[DS$WellName == WellSelect[i]]
    ...
    Sub1 <- DS[DS$WellName == WellSelect[i], ]
    ...
    WellS <- rep(WellSelect[i], length(EW))
    WellC <- rep(WellSelect[i], length(X)
    ...
}

可以替换为by它的参数sub是一个子集数据帧,除了Perf(一个单独的数据帧)。在这里,by返回两个 datafames 或lapply上述等效结构的内部列表的命名列表

df_lists <- by(DS, DS$WellName, FUN=function(sub) {

    S <- sub$MD
    P <- Perf$MidPerfMD[Perf$WellName == sub$WellName[1]]
    INCL <- sub$INCL
    AZIM <- sub$AZIM
    NS <- sub$NS
    EW <- sub$EW
    TVD <- sub$TVD

    ...
    Sub1 <- sub
    ...
    WellS <- rep(sub$WellName[1], length(EW))
    WellC <- rep(sub$WellName[1], length(X)

    # build dataframes for plots        
    # ... same as lapply above

})

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 Python/R 中两个不同大小的数据帧中进行 1 到 2 匹配

从 R 中的两个不同数据帧创建数组

基于两个不同列中的两个条件的子集数据帧R

如何在R中使用ggplot2绘制来自不同数据帧的两个序列彼此相对,而不建立新的数据帧?

R中不同大小的两个数据帧之间的操作

r为Shiny App中的两个图表绘制不同大小的图表

计算R中两个不同数据帧中两个时间戳之间的行

将两个不同列表的数据帧融为r中的一个数据帧列表

如何在R中合并两个不相等大小的数据帧

匹配R中不同数据帧中两个列对的值

R:如何从两个单独的数据中绘制数据

如何在R中组合来自不同数据帧的两个变量?

如何将两个不同的数据帧分组为 R 中函数的输入

对 R 中数据帧的两个不同列执行 MAD 计算

如何在 R 中合并具有不同长度和两个条件的两个数据帧?

使用R比较两个不同行的数据帧

合并R中不同行的两个数据帧

从 R 中数据帧的不同大小的底层中绘制相同大小的样本

在R中绘制数据

通过R中的两个条件过滤数据帧

数据帧r和grepl中的两个条件

在R中合并两个大小不同的矩阵

在R中的数据帧中的两个不同列中随机交换一定数量的条目

如何通过循环而不合并R中的两个不同长度的数据帧来合并?

在R中合并具有不同数据类型的不同键的两个数据帧

无法从 R 中的数据帧绘制不同类型的变量

如何合并两个大多数不同数据帧的列表,并将这些数据帧的行绑定到R中相同的名称?

在 R 中绘制两个函数的两条不同曲线时出错

在for循环中在R中绘制数据帧