累积密度图与ggplot和plotly

时间:2017-02-17 14:11:01

标签: r ggplot2 plotly

当我们从ggplot2 docs

中获取以下示例时
df <- data.frame(x = c(rnorm(100, 0, 3), rnorm(100, 0, 10)),
                 g = gl(2, 100))

library(ggplot2)
p <- ggplot(df, aes(x, colour = g)) + 
  stat_ecdf(geom = "step", na.rm = T) + # interchange point and step
  theme_bw()
p

我们可以创建一个标准的cdf图。现在,如果我们想要使用plotly中的情节,我会在使用step命令时获得一个非常混乱的图像。见下文。但是,当我使用point命令plotly时,表现应该如此。 step命令发生了什么?为什么我不能仅使用ggplot重新创建图像?

library(plotly)
ggplotly(p)

enter image description here

2 个答案:

答案 0 :(得分:0)

这可以使用ecdf()函数来解决。

##  ecdf function to get y and 1-y
rcdf <- function (x) {
  cdf <- ecdf(x)
  y1 <- cdf(x)
  y <- unique(y1)
  # xrcdf <- 1-y  ##  to get reverse cdf
  xrcdf <- y    ##  to get cdf
}

ug <- unique(df$g)
ng <- length(ug)
xll <- min(df$x)
xul <- max(df$x)
adr <- data.frame(myxx=c(), myyy=c(), mygg=c())

lapply(1:ng, function(i){
  ad2r <- subset(df, g==ug[i])
  myx1 <- unique(ad2r$x)
  myxx <- c(xll,myx1,xul)       ##  add lowest value - dummy to assign 100%
  myy1 <- rcdf(ad2r$x)
  # myyy <- c(1.0,myy1,0.0)     ##  add 100%  to get reverse cdf
  myyy <- c(0.0,myy1,1.0)       ##  add 0%  to get cdf
  mygg <- ug[i]
  ad2rf <- data.frame(myxx,myyy,mygg)
  adr <<- rbind(adr,ad2rf)
})

adf <- adr[order(adr$myxx),]

pp <- ggplot(data=adf, 
             aes_(x=adf$myxx, y=100*adf$myyy, col=adf$mygg, group=adf$mygg)) +
        geom_step() +
        labs(title="CDF", y = "Y", x = "X", col=NULL) 

ppp  <-  ggplotly(pp, tooltip=c("x","y"))
ppp

这将提供以下输出:

CDF

答案 1 :(得分:0)

我在这里找到了解决方案 https://community.plotly.com/t/bug-with-ggplot2-stat-ecdf-function/1187/3。 您应该沿 x 重新排列数据框。

min

enter image description here