кривая плотности на плотностной гистограмме

Я использую plotly для построения гистограммы для набора данных, с которым я работаю

test  <- data.frame(y = rgamma(1000, shape = 0.25, rate = 0.0054))
plot_ly(x = ~test$y, type = "histogram", nbinsx = "23")

График как таковой прекрасный, но мне непонятно, как нарисовать плавную кривую плотности, проходящую через контуры гистограммы.

Plotly справочное руководство предлагает,

Трассировка гистограммы инициализируется с помощью plot_ly или add_trace:

plot_ly(df, type="histogram"[, ...])
add_trace(p, type="histogram"[, ...]) 

и есть histnorm (enumerated: "" | "percent" | "probability" | "density" | "probability density" )функция histonorm, которая, как я предполагаю, позволит пользователям рисовать кривую плотности, но я не уверен, как использовать эту функцию.

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

2 ответа

  1. Один из вариантов, самый простой, если вы больше знакомы с API ggplot, чем plotly (как я), состоит в том, чтобы сначала сделать сюжет с ggplot2.

    library(plotly)
    library(ggplot2
    test  <- data.frame(y = rgamma(1000, shape = 0.25, rate = 0.0054))
    
    p <- ggplot(test, aes(x = y, y = ..density..)) +
       geom_histogram(fill = "steelblue", bins  = 23) +
       geom_density()
    
    ggplotly(p)
    

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

  2. Пока не идеально — вот один из способов сделать это.

    EDIT: обновлено для ограничений по оси y

    library(plotly)
    
    y <- rgamma(1000, shape = 0.25, rate = 0.0054)
    dens <- data.frame(x = density(y)$x,
                       y = density(y)$y)
    
    miny <- 0
    maxy <- max(dens$y)
    
    plot_ly() %>% 
      add_histogram(x = y) %>% 
      add_lines(data = dens, x = ~x, y = ~y, yaxis = "y2", 
                line = list(width = 3)) %>% 
      layout(yaxis2 = list(overlaying = "y", 
                           side = "right", 
                           range = c(miny, maxy),
                           showgrid = F, 
                           zeroline = F))