Как отобразить рассчитанные значения поверх гистограммы с накоплением в r

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

myDF <- structure(list(Group = structure(1:3, .Label = c("2017-04-02", 
"2017-04-09", "2017-04-16"), class = "factor"), Passive = c(4, 
1, 0), Promoter = c(12, 1, 4), Detractors = c(0, 0, 0)), .Names = c("Group", 
"Passive", "Promoter", "Detractors"), row.names = c(NA, -3L), class = "data.frame")


x <- list(
  title = ""
)
y <- list(
  title = "Count"
)

p <- plot_ly(myDF, x = ~Group)

if ("Detractors" %in% colnames(myDF[-1])){
  p <- add_trace(p, y = ~`Detractors`, name = 'Detractors', type = 'bar',
                 marker = list(color = '#D52728')) #red
}
if ("Passive" %in% colnames(myDF[-1])){
  p <- add_trace(p, y = ~`Passive`, name = 'Passive', type = 'bar', 
                 marker = list(color = '#1F78B4')) #orange
}
if ("Promoter" %in% colnames(myDF[-1])){
  p <- add_trace(p, y = ~`Promoter`, name = 'Promoter', type = 'bar', 
                 marker = list(color = '#2BA02D')) #green
}
p <- layout(p, xaxis = x, yaxis = y, barmode = 'stack', legend = list(orientation = 'h'), showlegend=T)

p

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

Я хочу отображать результаты сетевого промоутера в верхней части каждой панели. Формула, которую я использую для расчета NPS: (Number of Promoters — Number of Detractors) / (Number of Respondents) x 100. Таким образом, для первого бара это будет ((12 - 0)/16) * 100 = 75. Я хочу показать NPS: 75 над первой полосой. Аналогично для второго и третьего столбца число вверху будет (1-0)/2*100 = 50 и (4-0)/4*100 = 100 соответственно. Я буду получать больше данных за ближайшие недели, поэтому в будущем будет столбец для каждой недели данных. Есть ли способ показать это вычисленное значение вверху столбцов?


person krish    schedule 20.04.2017    source источник


Ответы (1)


Вы можете добавить annotations к вашему layout, где значения x - это ваши даты, значения y - это сложенные значения, а текст - это Net Promoter Score, например

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

df = data.frame(x = c('A', 'B', 'C', 'D'),
                y = c(1,3,2,4),
                calculated_values = c(20,30,10,50)
)
annotations <- list()
for (i in 1:length(df$calculated_values)) {
  annotations[[i]] <- list(x = df$x[[i]],
                           y = df$y[[i]],
                           text = df$calculated_values[[i]],
                           yanchor='bottom',
                           showarrow = FALSE)

}
plot_ly(df,
        x = ~x, 
        y = ~y, 
        type = 'bar') %>% 
  layout(annotations = annotations)

Или для этого конкретного примера замените последние две строки вашего кода на:

annotations <- list()
for (row in rownames(myDF)) {
  annotations[[as.integer(row)]] = list(x = as.character(myDF[row,]$Group),
                                y = sum(myDF[row,][-1]),
                                text = ((myDF[row,][[3]] - myDF[row,][[4]]) / sum(myDF[row,][-1])) * 100,
                                yanchor='bottom',
                                showarrow = FALSE)

}
p <- layout(p, xaxis = x, yaxis = y, barmode = 'stack', legend = list(orientation = 'h'), showlegend=T, 
            annotations = annotations)

p

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

person Maximilian Peters    schedule 20.04.2017