Open
Description
Hi @cpsievert!
Here after your Shiny webinar, great stuff!
I'm having issues with the boxplot data aligning with x-axis tick marks in subplots. Please see below:
library (data.table)
library (stringr)
library (plotly)
# some setup:
get_plot_title = function(this.plot.title, y.pos = 1, y.shift = 0){
list(text = sprintf ("<b>%s</b>", this.plot.title), yshift = y.shift
, xref = "paper", yref = "paper", yanchor = "center", xanchor = "center", align = "center"
, x = 0.5, y = y.pos, showarrow = FALSE, font = list (size = 16, family = "Arial")
)}
generate_panel = function(dat, trace.name){
my.plot =
plot_ly(dat, type = "box"
, x= ~get(x_var), y= ~get(y_var), color = ~get(color_var)
, whiskerwidth = 0.1
, boxpoints = F
) %>%
layout(boxmode = "group", boxgroupgap = 0.1, boxgap = 0.15
, plot_bgcolor = "#F5F5F5"
, annotations = get_plot_title(trace.name, y.shift = 20)
, xaxis = list(title = "", tickfont = list(size = 14, family = "Arial")
, tickmode = "linear", ticks = "outside")
, yaxis = list(title = sprintf("<b>%s</b>", y_var), titlefont = list (size = 16, family = "Arial"))
)
my.plot #return
}
x_var = "cut"
y_var = "price"
color_var = "color"
X_panel_var = "clarity"
test.dat = ggplot2::diamonds %>% setDT
Without subplots, everything looks great:
generate_panel(test.dat, trace.name = "all")
Adding two horizontal subplots:
test.dat[, get(X_panel_var) %>% levels][1:2] %>%
lapply(function(this.panel.var){
generate_panel(dat = test.dat[this.panel.var, on = X_panel_var], trace.name = this.panel.var)
}) %>%
subplot(shareY = T, shareX = F, titleX = F, nrows = 1, which_layout = 1, margin = 0.01)
Boxplot groups shift off the centre of the xaxis ticks, and the boxgap argument becomes irrelevant:
Enlarging this plot does not work at all (cuts off the data at the original subplot width and height, yikes!):
Interestingly, with 3 horizontal subplots, the middle plot data is centered around ticks, but the outer plots are even further away (and the boxgaps are worse):
test.dat[, get(X_panel_var) %>% levels][1:3] %>%
lapply(function(this.panel.var){
generate_panel(dat = test.dat[this.panel.var, on = X_panel_var], trace.name = this.panel.var)
}) %>%
subplot(shareY = T, shareX = F, titleX = F, nrows = 1, which_layout = 1, margin = 0.01)
Just wondering if you have any ideas / suggestions?
Thank you!
Metadata
Metadata
Assignees
Labels
No labels
Activity
fabbra commentedon Apr 24, 2020
I have a similar / the same issue here:
Is there a workaround for this problem?
I would have expected that
legendgroup
would work to properly group the boxplots when usingboxmode='group'
.kmcentush commentedon May 4, 2020
I'm having the same problem. The code snippet provided by @fabbra is a good example.
It's interesting to note that when using plotly express w/ facet rows/cols, the boxplots are grouped properly. I haven't had a chance to dig into this yet, so I'm not sure why.
FelipeMoser commentedon Dec 26, 2020
Hi, I know this post is a bit old but I struggled with the same problem. The solution was to put the boxes I wanted aligned into the same "offsetgroup". Using Fanbras' code:
LukasHebing commentedon Nov 30, 2023
Is there a solution for the error in plotly express using
facet_row
orfacet_col
? The workaround to add each trace individually seems very tedious.mpage21 commentedon Mar 11, 2024
Still seeing this issue where grouped boxplots are being offset when two plots are combined with subplots. Because I'm working with tibbles, I don't see how I can apply the offset group suggested previously. Also, I need to be working with just plotly and not ggplotly, due to speed the plots need to be rendered at.
@cpsievert Do you have any suggestions?
Here is a simplified version of my code: