2017-04-20 2 views
0

Mit dem unten stehenden Code habe ich ein gestapeltes Balkendiagramm (siehe Abbildung).So zeigen Sie berechnete Werte über dem gestapelten Balkendiagramm in r an

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 

enter image description here

Ich möchte den Net Promoter Scores auf der jeweils bar zeigen. Die Formel, die ich für die Berechnung des NPS verwende, lautet: (Number of Promoters — Number of Detractors)/(Number of Respondents) x 100. Also für den ersten Balken wäre es ((12 - 0)/16) * 100 = 75. Ich möchte NPS: 75 oben auf dem ersten Balken anzeigen. Ähnlich ist für den zweiten und dritten Balken die Nummer oben (1-0)/2*100 = 50 bzw. (4-0)/4*100 = 100. Ich werde in den kommenden Wochen mehr Daten bekommen, so dass es zukünftig für jede Datenwoche einen Balken geben wird. Gibt es eine Möglichkeit, diesen berechneten Wert oben auf den Balken anzuzeigen?

Antwort

1

Sie hinzufügen könnte annotation s auf Ihre layout wo die x Werte Ihre Reisedaten sind, die y Werte sind die gestapelten Werte und der Text ist die Net Promoter Score, z.B.

enter image description here

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) 

Oder für dieses Beispiel mit den letzten beiden Zeilen des Codes ersetzt werden:

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 

enter image description here

Verwandte Themen