plotly.R icon indicating copy to clipboard operation
plotly.R copied to clipboard

Dynamic Axis Labels (Ticks) Misalignment with Data Points and Rangeslider

Open yananeuenschwander opened this issue 11 months ago • 2 comments

Description:

In my Plotly chart with a rangeslider, I'm facing a dilemma with axis labels (ticks). Without using tickvals, the chart incorrectly displays Sunday as the start of the week. When using tickvals to correct this, the axis labels don't dynamically adjust when zooming out, leading to overcrowding.

Expected Behavior:

  • The x-axis should consistently display Monday as the start of each week.
  • When zooming out, the axis should dynamically adjust to a coarser interval (e.g., every month, every quarter, or every year) to maintain readability.
  • The rangeslider should allow smooth navigation while preserving appropriate tick density at different zoom levels.

Actual Behavior:

  1. Without tickvals:
  • The chart incorrectly uses Sunday as the start of the week.

  • Zooming functions work as expected, with appropriate tick density at different zoom levels.

Image

  1. With tickvals:
  • The chart correctly displays Monday as the start of the week.

  • When zooming out, the axis doesn't adjust to a more appropriate interval, resulting in overcrowded and illegible labels.

Image

Reproducible Example:

library(shiny)
library(plotly)
library(lubridate)
library(dplyr)

# Example data
data <- data.frame(
  date = seq(as.Date("2024-01-01"), Sys.Date(), by = "day"),  
  value = runif(length(seq(as.Date("2024-01-01"), Sys.Date(), by = "day")), 10, 100)  
)

# Aggregate data by week
data_weekly <- data %>%
  mutate(week = floor_date(date, unit = "week", week_start = 1)) %>%
  group_by(week) %>% 
  summarise(value = sum(value)) 

# Create a plot with the week start as the x-axis
fig <- plot_ly(data = data_weekly,
               x = ~week,  
               y = ~value,  
               type = 'bar') %>%
  layout(xaxis = list(
    range = c(floor_date(max(data$date) - months(3) + days(4),
                         unit = "week", week_start = 1),  # Set the x-axis range starting 3 months before the latest date
              max(data$date + days(4))),  # Extend the range to the maximum date (with 4 extra days for buffer)
    tickvals = data_weekly$week  # Use the start of each week as the ticks on the x-axis
  )
  )


fig %>%
  config(displayModeBar = FALSE) %>%
  layout(xaxis = list(rangeslider = list(visible = TRUE)))  # Add a range slider for the x-axis

Additional Notes:

  • The issue arises from the need to use tickvals to enforce Monday as the week start, which then prevents Plotly's automatic tick adjustment.
  • An ideal solution would combine correct week start representation (Monday) with dynamic tick adjustment when zooming.

System info

R version: 4.3.3 (2024-02-29) Plotly version: 4.10.4 Operating System: Linux 5.15.173.1-1.cm2

yananeuenschwander avatar Feb 18 '25 17:02 yananeuenschwander

This might be related to https://github.com/plotly/plotly.js/issues/4815 and thus possibly resolved by upgrading to latest version of plotly.js - this work is currently underway.

romanzenka avatar Feb 21 '25 16:02 romanzenka

Follow-up: After further testing with Plotly R 4.11.0 (using Plotly.js v2.32.0), it appears that the original issue #4815 (“cannot change start of week day”) and the related axis tick behavior are still unresolved. I also couldn’t find any changelog or release note referencing a fix for #4815.

Could this issue be reopened or tracked as an open feature request?

yananeuenschwander avatar Oct 30 '25 10:10 yananeuenschwander