Как построить «круг ошибки» с помощью plotly - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть график пути, который описывает известные и оценочные данные. Для предполагаемой части я хочу добавить заштрихованные области, показывающие ожидаемую ошибку (которая одинакова в направлениях x и y).

Я попытался просто использовать add_markers с переменной size:

library(plotly)

data.frame(x = c(0, 1, 2, 1, 0, -1, -2, -1, 0),
           y = c(2, 1, 0, -1, -2, -1, 0, 1, 3),
           err = c(rep(NA, 6), 0.25, 0.5, 1)) %>%
  plot_ly() %>%
  add_paths(
    x = ~x,
    y = ~y
  ) %>%
  add_markers(
    x = ~x,
    y = ~y,
    size = ~err,
    marker = list(sizemode = "radius")
  )

enter image description here

Однако этого совершенно недостаточно. Значение err представляет «радиус круга ошибки». Таким образом, последняя точка (x=0, y=3) должна иметь окружность, идущую от y = 2..4, но вместо этого она имеет радиус около 0,75. Я мог бы исправить это, повозившись с аргументом marker.sizeref, но есть и другие проблемы. Поскольку параметр size фактически рассчитывается в пикселях, он не подвержен изменениям масштаба: если я увеличиваю или уменьшаю масштаб, круги не меняются в размере. А использование зум-бокса для изменения соотношения сторон должно привести к тому, что «круги ошибок» станут «эллипсами ошибок», что, очевидно, не происходит при использовании этого метода.

Теперь я знаю о заговоре shapes, но, похоже, у них нет эллипсов, и я не знаю, как создавать несколько фигур одновременно (кроме создания списка с помощью для l oop или чего-то в этом роде).

Так можно ли создавать такие "круги ошибок", используя сюжет?

1 Ответ

0 голосов
/ 28 февраля 2020

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

data.frame(x = c(0, 1, 2, 1, 0, -1, -2, -1, 0),
           y = c(2, 1, 0, -1, -2, -1, 0, 1, 3),
           err = c(rep(NA, 6), 0.25, 0.5, 1)) %>%
  plot_ly() %>%
  add_paths(
    x = ~x,
    y = ~y
  ) %>%
  layout(shapes = list(
           list(type = 'circle',
                       xref= 'x', x0 = -1, x1 = 1,
                       yref= 'y', y0 = 2, y1 = 4,
                       fillcolor = 'rgb(255,0,0)', 
                       line = list(color='rgb(255,0,0)'),
                       opacity = 0.7),
           list(type = 'circle',
                       xref= 'x', x0 = -1.5, x1 = -0.5,
                       yref= 'y', y0 = 1.5, y1 = 0.5,
                       fillcolor = 'rgb(255,0,0)', 
                       line = list(color='rgb(255,0,0)'),
                       opacity = 0.7),
           list(type = 'circle',
                       xref= 'x', x0 = -2.25, x1 = -1.75,
                       yref= 'y', y0 = 0.25, y1 = -0.25,
                       fillcolor = 'rgb(255,0,0)', 
                       line = list(color='rgb(255,0,0)'),
                       opacity = 0.7)
         ))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...