Проблема с добавлением цикла трассировки столбчатой диаграммы с плотным наложением

#r #shiny

#r #блестящий

Вопрос:

Я создаю столбчатую диаграмму с наложением в plotly, и всякий раз, когда я запускаю свой цикл для add_trace, возникает проблема, поскольку данные предыдущей трассировки, похоже, исчезают, а имена остаются.

         p = plot_ly( x = rownames(dist_data), y = as.numeric(dist_data[,1]), type = 'bar', name = colnames(dist_data)[1])%>%
      layout(legend = list(x = 0.1, y = 0.9))

    for ( j in 2:length(colnames(dist_data)))
    {
      p =  add_trace(p, y = ~as.numeric(dist_data[,j]), type = 'bar',name = colnames(dist_data)[j]) %>%
        layout( barmode = 'stack')
    }
    p
  

Мне интересно, есть ли что-то неправильное в цикле.
При попытке вручную добавить трассировку1 работает нормально. При добавлении трассировки 2 (j = 3) значения trace1 автоматически становятся равными значению trace2.

UPD: При использовании dplyr у меня возникают проблемы с некоторыми другими частями моего кода. Есть ли решение без этого?

Спасибо за помощь,

Ответ №1:

Вы перезаписываете p на каждой итерации цикла. Попробуйте:

 p =  p %>% add_trace(y = ~as.numeric(dist_data[,j]), type = 'bar',name = colnames(dist_data)[j]) %>%
        layout( barmode = 'stack')
  

2-я правка:
не уверен, почему это происходит. Это работает, если вы преобразуете фрейм данных в длинный формат, что является лучшей практикой, чем использование цикла for:

 mtcars %>% 
  mutate(id = rownames(.)) %>%
  gather(key = "variable",value = "value",-id) %>% 
  plot_ly(x = ~id, y=~value, type="bar", color=~variable) %>%
  layout(barmode = "stack")
  

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

Редактировать:

 dist_data=mtcars
p = plot_ly( x = rownames(dist_data), 
             y = as.numeric(dist_data[,1]), 
             type = 'bar', name = colnames(dist_data)[1]) %>%
  layout(legend = list(x = 0.1, y = 0.9))

for ( j in 2:length(colnames(dist_data))){
  p =  add_trace(p, y = ~as.numeric(dist_data[,j]), 
type = 'bar',name = colnames(dist_data)[j]) %>%
    layout( barmode = 'stack')
}
p
  

Комментарии:

1. Я получаю те же результаты.

2. И это не было перезаписано, потому что я мог видеть на своем графике все 7 меток данных из name = colnames (dist_data)[j]

3. вы правы, результат тот же. График хорош для меня с dist_data = mtcars, хотя. Может быть, pb с вашим фреймом данных?

4. Что ж, посмотрим на значения. Все значения, начинающиеся со второй переменной, одинаковы, например, все maseratti bora равны 8.

5. Наконец-то это работает 🙂 все еще довольно сложная задача. Не могли бы вы помочь мне с последней вещью? dist_data содержит даты в виде имен строк, как я мог бы использовать ось x в качестве даты? Преобразование в xts здесь, я полагаю, не является решением