Я строю график количества файлов данных, измеренных инструментом, как частоту в день в виде диаграммы с графиком.
Этот график используется внутри блестящего приложения, а диапазон дат, количество файлов в день и т. Д. Зависит от того, какой выбор пользователь делает в отношении данных, поэтому мне нужно, чтобы он работал для обоих сценариев описано ниже
Два графика, 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
))
СЦЕНАРИЙ 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
Внутри моего приложения график будет выглядеть так, и все это работает, за исключением ситуации с 1 баром ...