Диапазон установки частоты по сравнению с графиком гистограммы POSIXct разрывается с графиком R, когда на графике только 1 бар - PullRequest
0 голосов
/ 28 марта 2019

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

Этот график используется внутри блестящего приложения, а диапазон дат, количество файлов в день и т. Д. Зависит от того, какой выбор пользователь делает в отношении данных, поэтому мне нужно, чтобы он работал для обоих сценариев описано ниже

Два графика, 1 идентичный блок кода для его создания, с той лишь разницей, что количество баров равно 1 или> 1. 1 гистограмма сломана,> 1 гистограмма работает нормально, и мне это вообще не имеет смысла!

График отлично работает при построении графиков в течение 2 и более дней с заданным диапазоном или без него

range = c(dateRangeMin,dateRangeMax) внутри layout() устанавливает диапазон и, похоже, нарушает график в сценарии 1 bar .

Даты в формате POSIXct, '%Y-%m-%d %H:%M:%S', и я также настроен в этом формате

График также работает, когда на 1 день присутствуют только данные, когда я не устанавливаю диапазон. Как только я установил диапазон шире, чем 8 миллисекунд (автоматическое масштабирование), график масштабируется должным образом, но полоса для этого одного дня исчезает, и это не имеет никакого смысла вообще.

СЦЕНАРИЙ 1: Сломан

library(plotly)
#make a dataframe with 1 full date
dayPOSIXct <- as.POSIXct("2016-05-20 19:03:36",format = '%Y-%m-%d %H:%M:%S')
# 1 frequency value (nr of samples
frequency <- 1
# reduce full date to 1 day for counting samples per day
day <- format(as.POSIXct(dayPOSIXct, format = '%Y-%m-%d %H:%M:%S'), format = '%Y-%m-%d')
# give a tag for coloring (files can be in or out of selected date range
datecoloring <- "IN"
# put it together in a dataframe
MyDF_dayfreq <- data.frame(day = day, frequency = frequency, dayPOSIXct = dayPOSIXct, datecoloring = datecoloring)

# calculate the min and max dates of the dataframe for setting range in the plot
# I add 14 hours to the max, and subtract 14 hours from the min to widen the range of the plot  
dateRangeMin <- as.POSIXct( min(MyDF_dayfreq$dayPOSIXct), format = '%Y-%m-%d')-14*3600
dateRangeMax <- as.POSIXct( max(MyDF_dayfreq$dayPOSIXct), format = '%Y-%m-%d')+14*3600

p <-  plot_ly(data = MyDF_dayfreq, source = 'DateRangeHisto',  x = ~dayPOSIXct, y =  ~frequency,   type = "bar",
              color  = as.factor(MyDF_dayfreq$datecoloring), colors = c('#339fff', '#eaf5ff'),
              opacity= 0.5, showlegend = T,
              marker = list(line = list(width = 2, color = '#0000ff')),
              hoverinfo = "text",
              text = ~paste('Files:', MyDF_dayfreq$frequency, '<br>Date:', format(MyDF_dayfreq$day, format = '%Y-%m-%d'), sep = ' '))%>%

  layout(xaxis = list(title = "Date", showgrid = F, showline = T, range = c(dateRangeMin,dateRangeMax), list(tickformat = 'yyyy-mm-dd')),
         yaxis = list(title = "File count", showgrid = F, showline = T, range =c(0,2), tickformat=',d' ),
         margin = list(
           r = 10,
           t = 10,
           b = 40,
           l = 20
         ))

1 bar plot

СЦЕНАРИЙ 2: РАБОТА

dayPOSIXct <- as.POSIXct(c("2016-05-20 19:03:36", "2016-05-21 19:03:36"), format = '%Y-%m-%d %H:%M:%S')
frequency <- c(1,1)
day <- format(as.POSIXct(dayPOSIXct, format = '%Y-%m-%d %H:%M:%S'), format = '%Y-%m-%d')
MyDF_dayfreq <- data.frame(day = day, frequency = frequency, dayPOSIXct = dayPOSIXct, datecoloring = datecoloring)
dateRangeMin <- as.POSIXct( min(MyDF_dayfreq$dayPOSIXct), format = '%Y-%m-%d')-14*3600
dateRangeMax <- as.POSIXct( max(MyDF_dayfreq$dayPOSIXct), format = '%Y-%m-%d')+14*3600

p <-  plot_ly(data = MyDF_dayfreq, source = 'DateRangeHisto',  x = ~dayPOSIXct, y =  ~frequency,   type = "bar",
              color  = as.factor(MyDF_dayfreq$datecoloring), colors = c('#339fff', '#eaf5ff'),
              opacity= 0.5, showlegend = T,
              marker = list(line = list(width = 2, color = '#0000ff')),
              hoverinfo = "text",
              text = ~paste('Files:', MyDF_dayfreq$frequency, '<br>Date:', format(MyDF_dayfreq$day, format = '%Y-%m-%d'), sep = ' '))%>%

  layout(xaxis = list(title = "Date", showgrid = F, showline = T, range = c(dateRangeMin,dateRangeMax), list(tickformat = 'yyyy-mm-dd')),
         yaxis = list(title = "File count", showgrid = F, showline = T, range =c(0,2), tickformat=',d' ),
         margin = list(
           r = 10,
           t = 10,
           b = 40,
           l = 20
         ))
p

2 bar plot

Внутри моего приложения график будет выглядеть так, и все это работает, за исключением ситуации с 1 баром ... enter image description here

1 Ответ

0 голосов
/ 28 марта 2019

Не уверен, правильно ли я вас понял.Вам нужно играть с шириной полосы.Если количество баров = 1, то оно очень маленькое, но вам нужно увеличить его, чтобы увидеть.Но вы можете правильно установить ширину или масштаб фиксации с помощью параметра:

        dateRangeMin <- as.POSIXct( min(MyDF_dayfreq$dayPOSIXct), format = '%Y-%m-%d')-1*36
    dateRangeMax <- as.POSIXct( max(MyDF_dayfreq$dayPOSIXct), format = '%Y-%m-%d')+1*36

    p <-  plot_ly(data = MyDF_dayfreq, source = 'DateRangeHisto', 
                  color  = as.factor(MyDF_dayfreq$datecoloring), colors = c('#339fff', '#eaf5ff'),
                  opacity= 0.5, showlegend = T,
                  marker = list(line = list(width = 2, color = '#0000ff')),
                  hoverinfo = "text",
                  text = ~paste('Files:', MyDF_dayfreq$frequency, '<br>Date:', format(MyDF_dayfreq$day, format = '%Y-%m-%d'), sep = ' '))%>%


####################################    update
    add_bars( x = ~dayPOSIXct, y =  ~frequency,   type = "bar", width=20000 
              )%>%
 ##################################     
      layout(xaxis = list(title = "Date"#, showgrid = F# , showline = T
                          , range = c(dateRangeMin,dateRangeMax)#, list(tickformat = 'yyyy-mm-dd')
                          ),
             yaxis = list(title = "File count"#, showgrid = F, showline = T#, range =c(0,2), tickformat=',d' 
                          )
             #,
             #margin = list(r = 10,t = 10,b = 40,l = 20)
             )
...