Как добавить границы сюжета в субплоты Plotly в R? - PullRequest
0 голосов
/ 23 января 2020

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

    library(plotly)
    library(magrittr)

    set.seed(0)
    x <- seq(from=0, to=9, by=1)
    y1 <- rnorm(10)
    y2 <- rnorm(10)
    y3 <- rnorm(10)
    y4 <- rnorm(10)

    # Attempt 1
    p1 <- plot_ly(showlegend=FALSE) %>%
      add_markers(x = x, y = y1)

    p2 <- plot_ly(showlegend=FALSE) %>%
      add_markers(x = x, y = y2)

    p3 <- plot_ly(showlegend=FALSE) %>%
      add_markers(x = x, y = y3)

    p4 <- plot_ly(showlegend=FALSE) %>%
      add_markers(x = x, y = y4)

    p <- subplot(p1, p2, p3, p4,
                 nrows = 2, shareX = TRUE, shareY = TRUE) %>%
      layout(title='Attempt 1', xaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'),
             yaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'))

    # Attempt 2
    p1 <- plot_ly(showlegend=FALSE) %>%
      add_markers(x = x, y = y1) %>%
      layout(xaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'),
             yaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'))

    p2 <- plot_ly(showlegend=FALSE) %>%
      add_markers(x = x, y = y2) %>%
      layout(xaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'),
             yaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'))

    p3 <- plot_ly(showlegend=FALSE) %>%
      add_markers(x = x, y = y3) %>%
      layout(xaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'),
             yaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'))

    p4 <- plot_ly(showlegend=FALSE) %>%
      add_markers(x = x, y = y4) %>%
      layout(xaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'),
             yaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'))

    p <- subplot(p1, p2, p3, p4,
                 nrows = 2, shareX = TRUE, shareY = TRUE) %>%
      layout(title='Attempt 2')

    # Attempt 3
    p1 <- plot_ly(showlegend=FALSE) %>%
      add_markers(x = x, y = y1) %>%
      layout(xaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'),
             yaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'))

    p2 <- plot_ly(showlegend=FALSE) %>%
      add_markers(x = x, y = y2) %>%
      layout(xaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'),
             yaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'))

    p3 <- plot_ly(showlegend=FALSE) %>%
      add_markers(x = x, y = y3) %>%
      layout(xaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'),
             yaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'))

    p4 <- plot_ly(showlegend=FALSE) %>%
      add_markers(x = x, y = y4) %>%
      layout(xaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'),
             yaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'))

    p <- subplot(p1, p2, p3, p4,
                 nrows = 2, shareX = TRUE, shareY = TRUE) %>%
      layout(title='Attempt 3', xaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'),
             yaxis = list(showline = TRUE, mirror = TRUE, linecolor = 'black'))

Attempt 1 Attempt 2 Attempt 3

Ответы [ 2 ]

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

Если вы дадите каждому графику одинаковые range в атрибутах макета, ваши отдельные границы будут сохранены.

Вот как я предлагаю определить ваш диапазон:

#find the max and min Y, which you will use as your range values
your_Ys<-c(y1,y2,y3,y4)
max_y<-ceiling(max(your_Ys))
min_y<-floor(min(your_Ys))

Вместо того, чтобы составлять список атрибутов на каждом графике, я определяю здесь атрибуты x и Y:

#These are the layout attributes for Y
ay <- list(
  showline = TRUE,
  mirror = "ticks",
  linecolor = toRGB("black"),
  linewidth = 2,
  range = c(min_y, max_y)
)

#These are the layout attributes for X
ax <- list(
  showline = TRUE,
  mirror = "ticks",
  linecolor = toRGB("black"),
  linewidth = 2,
  range = c(-1, 10)
)

И теперь пришло время соединить все это.

p1 <- plot_ly(showlegend=FALSE) %>%
  add_markers(x = x, y = y1)  %>% layout( xaxis = ax, yaxis = ay)

p2 <- plot_ly(showlegend=FALSE) %>%
  add_markers(x = x, y = y2)  %>% layout( xaxis = ax, yaxis = ay)

p3 <- plot_ly(showlegend=FALSE)%>%
  add_markers(x = x, y = y3) %>%layout( xaxis = ax, yaxis = ay)

p4 <- plot_ly(showlegend=FALSE) %>%
  add_markers(x = x, y = y4)%>% layout( xaxis = ax, yaxis = ay)

p <- subplot(p1, p2, p3, p4,
             nrows = 2, shareX = FALSE, shareY = FALSE) %>%
  layout(title='Tada!')
p

plotly subplot with border lines

1 голос
/ 23 января 2020

Я уверен, что у кого-то будет для вас чистое plotly решение, но здесь есть работа, где мы создаем ggplot объекты, а затем конвертируем в plotly

library(plotly)
library(tidyverse)

set.seed(0)
x <- seq(from=0, to=9, by=1)
y1 <- rnorm(10)
y2 <- rnorm(10)
y3 <- rnorm(10)
y4 <- rnorm(10)

p1 <- 
  {ggplot(tibble(x, y1), aes(x,y1))+
  geom_point(color = "blue")+
  labs(x='', y='')+
  theme_bw()+
  theme(panel.border = element_rect(color = "black"))} %>%
  ggplotly()

p2 <- 
  {ggplot(tibble(x, y2), aes(x,y2))+
  geom_point(color = "orange")+
  labs(x='', y='')+
  theme_bw()+
  theme(panel.border = element_rect(color = "black"))} %>%
  ggplotly()

p3 <- 
  {ggplot(tibble(x, y3), aes(x,y3))+
  geom_point(color = "green")+
  labs(x='', y='')+
  theme_bw()+
  theme(panel.border = element_rect(color = "black"))} %>%
  ggplotly()

p4 <- 
  {ggplot(tibble(x, y4), aes(x,y4))+
  geom_point(color = "red")+
  labs(x='', y='')+
  theme_bw()+
  theme(panel.border = element_rect(color = "black"))} %>%
  ggplotly()


subplot(p1, p2, p3, p4,nrows = 2, shareX = TRUE, shareY = TRUE)

enter image description here

...