Реплицируйте диаграмму ggplot2 с фасетками и аннотациями стрелок на графике - PullRequest
2 голосов
/ 23 января 2020

Я хочу скопировать ggplot2 диаграмму в plotly, для этого я попытался использовать функцию ggplotly. Диаграмма следующая (p_arrow):

library(data.table)
library(ggplot2)
library(plotly)

dset <- data.table(x = c(0, 1),
                   y = c(0, 1),
                   treatment = c(0, 1))

x_start <- dset[treatment == 0, x]
x_end <- dset[treatment == 1, x]
y_start <- dset[treatment == 0, y]
y_end <- dset[treatment == 1, y]
# base chart
p <- ggplot(dset, aes(x, y)) + geom_point() + facet_grid( ~ treatment)
# add annotations
p_arrow <- p +   annotate(
  "segment",
  x = x_start,
  xend = x_end,
  y = y_start,
  yend = y_end,
  lty = 1,
  size = 1,
  arrow = arrow()
)
# chart to be replicated
p_arrow 
# If I convert to plotly I lose the arrow
ggplotly(p_arrow)

Версия plotly не имеет стрелок. Это знаю проблему , поэтому я искал способ добавить аннотацию непосредственно в plotly.

1-е испытание:

# my trials in ggplotly
pl <- ggplotly(p)
#pl1 only annotates the fist subplot
pl1 <- pl %>% add_annotations(
  x = x_start,
  y = y_start,
  xref = "x",
  yref = "y",
  axref = "x",
  ayref = "y",
  text = "",
  showarrow = TRUE,
  ax = x_end,
  ay = y_end,
  arrowcolor = "black"
)

pl1

Проблема: второе подзаговор не имеет аннотаций.

2-я пробная версия:

# add annotation in axis x2 and y2
pl2 <- pl1 %>% add_annotations(
  x = x_start,
  y = y_start,
  xref = "x2",
  yref = "y2",
  axref = "x2",
  ayref = "y2",
  text = "",
  showarrow = TRUE,
  ax = x_end,
  ay = y_end,
  arrowcolor = "black"
)

pl2

Проблема: во 2-м подспоте отсутствует точка.

Есть ли способ дублировать p_arrow

1 Ответ

3 голосов
/ 27 января 2020

Если вы установите yref для одной и той же оси в обоих вызовах add_annotations (т.е. "y" вместо "y2"), то это решит проблему:

pl <- ggplotly(p)

pl <- pl %>% add_annotations(
        x = x_end,
        y = y_end,
        xref = "x2",
        yref = "y",
        axref = "x2",
        ayref = "y",
        text = "",
        showarrow = TRUE,
        arrowhead = 3,
        arrowsize = 2,
        ax = x_start,
        ay = y_start
) %>% add_annotations(
        x = x_end,
        y = y_end,
        xref = "x",
        yref = "y",
        axref = "x",
        ayref = "y",
        text = "",
        showarrow = TRUE,
        arrowhead = 3,
        arrowsize = 2,
        ax = x_start,
        ay = y_start
)

Так что теперь pl выглядит так: new image

Что похоже (и на самом деле немного лучше) оригинала:

original image

...