Banco de dados simulados

Imitando uma coluna com o nome e uma com a quantidade de missings

db_ano1 <- data.frame(
  nomes    = paste0('nome ', 1:500),
  missings_1 = as.integer(rnorm(500, mean = 20, sd = 5))
)

db_ano2 <- data.frame(
  nomes = paste0('nome ', 1:500),
  missings_2 = as.integer(runif(500, 0, 35))
)

db_ano3 <- data.frame(
  nomes    = paste0('nome ', 1:500),
  missings_3 = as.integer(rnorm(500, mean = 20, sd = 5))
)

Juntando as bases de dados

Vamos criar somente uma base de dados, calcular o número de missings por sujeito nos três anos e ordenar os nomes por quantidade de missings em um vetor tipo fator

library(plyr)
db_final <- join_all(
  list(
    db_ano1,
    db_ano2,
    db_ano3
  ),
  by   = 'nomes',
  type = 'left'
) 

db_final$soma_missings <- rowSums(db_final[, 2:4])

db_final$nomes <- factor(
  db_final$nomes, 
  levels = db_final$nomes[
    order(
      db_final$soma_missings,
      decreasing = T
    )
  ]
)

Gera o gráfico

O gráfico vai ser gerado do indivíduo com mais missing para o indivíduo com menos missing. Pra instanciar o gráfico vamos passar o primeiro ano, depois adicionar traços (add_trace()) para cada um dos outros anos. layout() será responsável por indicar que é um gráfico tipo stacked, tirar a distância entre as barras e dar os títulos do gráfico, eixos e legenda.

library(plotly)

plot_ly(
  db_final,
  x = ~nomes,
  y = ~missings_1,
  type = 'bar',
  name = '1° ano'
) %>%
  add_trace(
    y = ~missings_2,
    name = '2° ano'
  )%>%
  add_trace(
    y = ~missings_3,
    name = '3° ano'
  ) %>% 
  layout(
    barmode = 'stack',
    bargap = 0,
    title = list(
      text = '<b>Quantidade acumulada de missings por respondente</b>'
    ),
    yaxis = list(
      title = 'Quantidade'
    ),
    xaxis = list(
      title = 'Respondentes'
    ),
    legend = list(
      title = list(
        text='<b> Ano de coleta </b>'
      )
    )
  ) %>% 
  config(
    displayModeBar = F
  )