如何让ggplot2 geom_contour复制基本图形轮廓

时间:2018-05-15 17:41:36

标签: r plot ggplot2 contour

我正在使用copula根据事件的持续时间和大小来查看事件发生的概率。我可以使用基本R图形中的观察和模拟数据创建重复间隔的轮廓,但我无法弄清楚如何在ggplot2中重现。为什么不在基本图形中生成图形并继续前进,您可能想知道?因为我在简短的摘要报告中包含了图表,并希望与报告中的许多其他图表保持一致。下面是一些示例代码。我知道使用GEV分布的位置,比例和形状来创建随机偏差以获得相同的分布是不理想的,但这是我想到的最好的方法来创建一个可重复的例子,尽管相关性很差在末尾。在基础R中,轮廓是从模拟数据矩阵生成的。这可能在ggplot2中吗?

library(evd)
library(copula)

dur <- rgev(500, 2.854659, 2.170122, -0.007829)

mag <- rgev(500, 0.02482, 0.01996, 0.04603)

fDurGev <- fgev(dur)

fMagGev <- fgev(mag)

durVec <- dgev(dur, fDurGev[[1]][1], fDurGev[[1]][2], fDurGev[[1]][3])

magVec <- dgev(mag, fMagGev[[1]][1], fMagGev[[1]][2], fMagGev[[1]][3])

durMagMat <- as.matrix(cbind(duration = durVec, magnitude = magVec))

theta <- coef(fitCopula(claytonCopula(dim = 2), durMagMat, method = "itau"))

clayCop <- claytonCopula(theta, dim = 2)

fCopDurMag <- pCopula(durMagMat, clayCop)

copPts <- data.frame(duration = dur, magnitude = mag, copNEP = fCopDurMag, 
                     copEP = (1 - fCopDurMag), copRI = (1 / fCopDurMag))

fSim <- seq(0.05, 0.99998, length.out = 1000)

quaDur <- qgev(fSim, fDurGev[[1]][1], fDurGev[[1]][2], fDurGev[[1]][3])

quaMag <- qgev(fSim, fMagGev[[1]][1], fMagGev[[1]][2], fMagGev[[1]][3])

expDurMagMat <- cbind(expand.grid(fSim, fSim)$Var1, expand.grid(fSim, 
                                                        fSim)$Var2)

simPred <- pCopula(expDurMagMat, clayCop)

simPredMat <- matrix(simPred, 1000, 1000)

simDF <- data.frame(simDur = quaDur, simMag = quaMag, simPredMat)

rndPred <- data.frame(rCopula(5000, clayCop))

rndPred$rndDur <- qgev(rndPred[,1], fDurGev[[1]][1], fDurGev[[1]][2], 
                       fDurGev[[1]][3])

rndPred$rndMag <- qgev(rndPred[,2], fMagGev[[1]][1], fMagGev[[1]][2], 
                       fMagGev[[1]][3])

RI <- c(1.25, 2 ,5, 10, 20, 50, 100, 200, 500)
NEP <- 1 - (1 / RI)

plot(rndPred$rndDur, rndPred$rndMag, col = "light grey", cex = 0.5, xlab = 
     "Duration (time)", ylab = "Magnitude (x)")

points(copPts[,1], copPts[,2], col = "red", cex = 0.5)

contour(simDF$simDur, simDF$simMag, simPredMat, levels = NEP, labels = RI,  
        xaxs = 'i', yaxs = 'i', labcex = 0.6, lwd = 1, col = "black", add = 
        TRUE, method = "flattest", vfont = c("sans serif", "plain"))

contour plot from base graphics

现在我尝试在ggplot2中重新创建(无法绘制轮廓)。

library(dplyr)

simDF <- data.frame(dur = expDurMagMat[, 1], mag = expDurMagMat[, 2], NEP = simPred)

simDF <- simDF %>% 
  dplyr::mutate(quaDur = qgev(NEP, fDurGev[[1]][1], fDurGev[[1]][2], fDurGev[[1]][3])) %>% 
  dplyr::mutate(quaMag = qgev(NEP, fMagGev[[1]][1], fMagGev[[1]][2], fMagGev[[1]][3]))

library(ggplot2)

ggplot(data = rndPred, aes(x = rndDur, y = rndMag)) +
  geom_point(color = "light grey", alpha = 0.5) + 
  labs(x = "Duration (time)", y = "Magnitude (x)") +
  geom_point(data = copPts, aes(x = duration, y = magnitude), 
             color = "red") +
  geom_contour(data = simDF, aes(x = quaDur, y = quaMag, z = NEP), 
               inherit.aes = FALSE, breaks = NEP) +
  theme_classic()

plot from ggplot2 which fails on contours

感谢任何能提供帮助的人。

0 个答案:

没有答案