R: Как игнорировать фигуры при автоматическом масштабировании оси диаграммы в графике?

#r #charts #plotly #r-plotly

Вопрос:

У меня есть график, на котором ось x-дата. Я добавил прямоугольную форму, чтобы выделить указанный период даты. Иногда этот период даты будет находиться в диапазоне дат данных, отображаемых на диаграмме, и в этом случае проблем нет. Диаграмма отображается как обычно. Однако возможно, что период даты находится за пределами диапазона дат на графике (или он перекрывается, причем часть его находится за пределами диапазона дат на графике). В этом случае при создании диаграммы ось x автоматически масштабируется, чтобы отобразить полный прямоугольник, а также данные (или трассировки).

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

См. Приведенный ниже код в качестве примера. Это отредактированная версия кода, взятая отсюда: https://plotly.com/r/shapes/#lines

Диапазон дат данных-1967-2015 годы. Автоматический масштаб оси x должен основываться только на этом. Однако, поскольку один из прямоугольников имеет координаты x 1940 и 1945 годов, ось x автоматически масштабируется до 1940-2015 годов, чтобы отобразить полный прямоугольник, оставляя большой промежуток между 1940 и 1967 годами без данных. Я хочу, чтобы это было так, чтобы, если пользователь вручную увеличит масштаб до масштаба 1940-2015 годов, это то, что они увидят, но автоматическое масштабирование должно игнорировать прямоугольник и по умолчанию использовать диапазон 1967-2015 годов.

 library(plotly)
fig <- plot_ly(economics, x = ~date, y = ~uempmed, name = "unemployment")

# add shapes to the layout
fig <- layout(fig, title = 'Highlighting with Rectangles',
              shapes = list(
                list(type = "rect",
                     fillcolor = "blue", line = list(color = "blue"), opacity = 0.3,
                     x0 = "1940-01-01", x1 = "1945-01-01", xref = "x",
                     y0 = 0, y1 = 1, yref = "paper"),
                list(type = "rect",
                     fillcolor = "blue", line = list(color = "blue"), opacity = 0.2,
                     x0 = "2000-01-01", x1 = "2005-01-01", xref = "x",
                     y0 = 0, y1 = 1, yref = "paper")))

fig
 

В документации, похоже, нет ничего, что касалось бы этой проблемы, и я тоже ничего не могу найти в Google. Но я был бы удивлен, если бы оказался единственным человеком, который когда-либо хотел это сделать, поэтому я думаю, что наверняка должен быть вариант.

Does anyone know?

EDIT: I have discovered that I can define the range of the x-axis manually, and can take this to be the minimum and maximum of the x column. However, two drawbacks of this approach. One is that the outer points lie exactly on the boundary, so half of the point or bar (if you have a bar chart) gets cropped out which doesn’t look good.

The other potential drawback is when you click the autoscale button it still zooms right out to see the rectangles outside of the range. This may or may not be desirable, but it will be good to know if an alternative method exists.

 library(plotly)
fig <- plot_ly(economics, x = ~date, y = ~uempmed, name = "unemployment")

minx <- min(economics$date)
maxx <- max(economics$date)

x_axis <- list(
  range = c(minx,maxx)
)

# add shapes to the layout
fig <- layout(fig, xaxis= x_axis, title = 'Highlighting with Rectangles',
              shapes = list(
                list(type = "rect",
                     fillcolor = "blue", line = list(color = "blue"), opacity = 0.3,
                     x0 = "1940-01-01", x1 = "1945-01-01", xref = "x",
                     y0 = 0, y1 = 1, yref = "paper"),
                list(type = "rect",
                     fillcolor = "blue", line = list(color = "blue"), opacity = 0.2,
                     x0 = "2000-01-01", x1 = "2005-01-01", xref = "x",
                     y0 = 0, y1 = 1, yref = "paper")),
              xaxis = list(range=c(as.Date("1980-01-01"),as.Date("2000-01-01")))
)

fig