Постройте ecdf и плотность на одном графике и увеличьте масштаб до определенной части

Я хочу изобразить плотность и ecdf на одном графике с помощью ggplot2. Я написал здесь код

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))

В результате (кроме черного прямоугольника)

введите описание изображения здесь

Однако ось неправильная, левая ось y должна быть пределом плотности (0,0.4), а правая ось y должна быть пределом ecdf (0,1). Я также хочу, чтобы обе цифры были масштабированы, например, максимальная плотность, то есть 0,4 должно соответствовать максимуму ecdf 1.

После этого я хочу увеличить изображение, особенно правую верхнюю часть (черный прямоугольник, верхние 25%), поскольку весь график не нужен. Мне нужны два графика: один полностью, а другой увеличен.

Дайте мне знать, как это делается с помощью ggplot2.


person user3978632    schedule 09.05.2018    source источник
comment
вторая проблема может быть решена с помощью ggplot2::coord_cartesian()   -  person Roman    schedule 09.05.2018


Ответы (1)


Вы можете попытаться вычислить плотность и эмпирическое кумулятивное распределение перед построением графика. Здесь я использую тидиверс. Здесь особенно полезны 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"))

введите описание изображения здесь

# zooming 
p + coord_cartesian(xlim = c(1.5, 5))
person Roman    schedule 09.05.2018
comment
плотность не правильная. он должен масштабироваться до максимума около max (density (var1) $ y), то есть 0,408. - person user3978632; 09.05.2018
comment
Благодарю. Я хочу это для своей первой части. Я хочу увеличить правый верхний угол рисунка. p +ordin_cartesian (xlim = c (15000, 0.9)), но это не сработало. ты знаешь, работает ли это так? - person user3978632; 09.05.2018
comment
@ user3978632 попробовать c (0.9, 1.5)? - person Roman; 09.05.2018