plotly / plotly.R

An interactive graphing library for R
https://plotly-r.com
Other
2.54k stars 623 forks source link

Aspect ratio with small multiples / subplots #1288

Open ratnanil opened 6 years ago

ratnanil commented 6 years ago

I would like to create small multiples with a fixed aspect ratio. However, there seems to be a but somewhere and only some plots retain the correct aspect ratio. From what I gathered, setting a fixed aspect ratio with plotly is done as follows: layout(yaxis = list(scaleanchor = "x"))

Consider the follwing example:

df <- data_frame(
  x = rep(1:5,25),
  y = rep(1:5,25),
  g = sort(rep(1:25,5))
)

plots <- df %>%
  split(.$g) %>%
  map(function(x){
    plot_ly(data = x, x = ~x, y = ~y, type = "scatter",mode = "lines") %>% add_lines()
  })

small_mulitples <- subplot(plots,nrows = 5) %>%
  layout(yaxis = list(scaleanchor  = "x")) %>%
  hide_legend()

If I plot small_mulitples, only the first plot (row 1, column 1) has an aspect ratio of 1. The other have an arbitrary aspect ratio. small_multiples

Here's the link to the interactive version of this plot: https://plot.ly/~rata_zhaw/1/

Interestingly, if I choose the option shareX = T in subplot(), the entire first column has the correct aspect ratio. Nothing changes if I choose shareY = T

small_mulitples <- subplot(plots,nrows = 5, shareX = T) %>%
  layout(yaxis = list(scaleanchor  = "x")) %>%
  hide_legend()

small_multiples2

And here's the link to the interactive version of the second plot: https://plot.ly/~rata_zhaw/3/

If I plot any of the plots individually, the aspect ratio is correct:

plots[[10]] %>%
  layout(yaxis = list(scaleanchor  = "x")) %>%
  hide_legend()
ratnanil commented 6 years ago

Stéphane Laurent posted a working answer to this problem on Stackoverflow: https://stackoverflow.com/a/51880088/4139249

small_multiples <- subplot(plots,nrows = 5) %>%
  layout(scene = list(aspectration=list(x=1,y=1))) %>%
  hide_legend()

Feel free to close this issue.

cpsievert commented 6 years ago

subplot() doesn't (yet) respect scaleanchor, but I think it could