r ggplot plotly - заполнить область под кривой CDF - PullRequest
0 голосов
/ 19 сентября 2018

Используя функцию stat_ecdf () ggplot2, я создал график функции накопленной плотности.Мне необходимо заштриховать область под кривой CDF между двумя значениями оси X и преобразовать ее в график вывода.Используя набор данных IRIS, я скопировал сценарий со следующим кодом:

library(ggplot2)

iris <- datasets::iris

iris <- iris[order(iris$Sepal.Length),]

(plot_1 <- ggplot(iris, aes(Sepal.Length)) + 
    stat_ecdf() +
    scale_x_reverse())

plot_1_plotly <- ggplotly(plot_1)
plot_1_plotly

(plot_2 <- ggplot(iris, aes(Sepal.Length)) + 
    stat_ecdf(aes(ymin = 0, ymax = ..y..), geom = "ribbon", alpha = 0.2, 
    fill = "blue") +
    stat_ecdf(geom="step") +
    scale_x_reverse())

plot_2_ggplotly <- ggplotly(plot_2)
plot_2_ggplotly
  • plot_1 производит этот вывод , который является нормальной кривой CDF(не заштриховано)
  • plot_1_plotly производит этот вывод , который представляет собой сюжетную версию (без затемнения)
  • plot_2 производит это вывод , который является моей попыткой получить область под затененной кривой (с помощью ответа на этот вопрос )
  • plot_2_plotly выдает этот вывод , который является сюжетной версией plot_2

Вопрос 1: В выводе plot_2, как мне ограничить затененную область между двумя x-Значения оси (скажем, x = 6 и x = 7)?

Вопрос 2: Когда я преобразовываю plot_2 в вывод графика, то есть plot_2_plotly, почему затененная область портится, как показано навыход?Как вернуться к исходному виду?

1 Ответ

0 голосов
/ 08 декабря 2018

Я столкнулся с подобной проблемой, пытаясь затенить область кривой CDF для экспоненциальной функции выживания.Используя geom_polygon, я смог найти решение для линейного графика CDF.

# creating poisson distribution with mean of 15 and cumulative count/ proportion
cumulative_frequencies <- data.frame(person_id=1:100,  
                      num_active_days=rpois(10000, lambda=15)) %>% 
                      group_by(num_active_days) %>% summarise(num_people = n()) %>% 
                      arrange(num_active_days) %>% 
                      mutate(cum_frequency=cumsum(num_people),
                      rel_cumfreq = cum_frequency/sum(num_people))


# create cdf curve
p <- ggplot(cumulative_frequencies, aes(x=num_active_days, y=rel_cumfreq)) +  
   geom_line() + 
   xlab("Time") + 
   ylab("Cumulative Density")  + theme_classic()
p

enter image description here

Затем затенение в нужной области подкривая с использованием geom_polygon:

# minimum value of x for the area under the curve shading
x_start <- 15
x_end   <- 20

#Subset the data and add the coordinates to make it shade to y = 0
shade <- rbind(c(x_start,0), subset(cumulative_frequencies, num_active_days >= 
x_start & num_active_days <= x_end), c(x_end, 0))

# add shading to cdf curve
p + geom_polygon(data = shade, aes(num_active_days, rel_cumfreq))

enter image description here

...