在同一绘图中绘制ecdf和密度并放大到特定部分

时间:2018-05-09 11:50:12

标签: r ggplot2 zoom density-plot ecdf

我想使用ggplot2在同一个图中绘制密度和ecdf。我在这里写了一段代码

library(ggplot2)
library(reshape)


set.seed(101)
var1 = rnorm(1000, 0.5)
var2 = rnorm(100000,0.5)
combine = melt(data.frame("var1" = var1,"var2"= var2))
ggplot(data = combine) + 
  geom_density(aes(x = value, color = variable), alpha = 0.2)+
  scale_y_continuous(name = "Density",sec.axis = sec_axis(~.*(1*(max(density(var1)$y,density(var2)$y))), name = "Ecdf")) +
  ggtitle("Density and Ecdf plot ") +
  theme_bw() +
  theme(plot.title = element_text(size = 14, family = "Tahoma", face = "bold"),
        text = element_text(size = 12, family = "Tahoma")) +
  scale_fill_brewer(palette="Accent")+
  stat_ecdf(aes(x = value, color = variable))

这导致(黑色矩形除外)

enter image description here

但是,轴不正确,左侧yaxis应为密度限制(0,0.4),右侧y轴应为ecdf限制(0,1)。我还希望两个数字都可以缩放,例如最大密度,即0.4应该对应于ecdf 1的最大值。

在此之后我想放大图中特别是右上角部分(黑色矩形,上部25%),因为不需要整个图。我需要一个完整范围的两个图,另一个缩放。

让我知道它是如何使用ggplot2完成的。

1 个答案:

答案 0 :(得分:2)

您可以尝试在绘图之前计算密度和经验累积分布。我在这里使用tidyverse。特别是purrr::map函数在这里很有帮助。

library(tidyverse)
# density
dens <- combine %>% 
  as.tibble() %>% 
  split(.$variable) %>% 
  map(~density(.x$value) %>% 
        with(.,tibble(x=x, y=y))) %>% 
  bind_rows(.id = "variable") 
# ecdf
df <- combine %>% 
  as.tibble() %>% 
  split(.$variable) %>% 
  map2(.,split(dens, dens$variable), ~ecdf(.x$value)(.y$x) %>% 
        tibble(x=.y$x, Ecdf=.)) %>% 
  bind_rows(.id = "variable") %>% 
  bind_cols(dens,.)
# scaling factor
SCALE <- max(df$y)
# the plot
ggplot(df,aes(x,color=variable)) + 
     geom_line(aes(y=y)) + 
     geom_line(aes(y=Ecdf*SCALE)) +
     scale_y_continuous(name = "Density",sec.axis = sec_axis(trans = ~./SCALE, name = "Ecdf"))

enter image description here

# zooming 
p + coord_cartesian(xlim = c(1.5, 5))