[BUG]: Violin plot width incorrectly calculated in grouped mode with multiple x-categories
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- JavaScript
- Estrellas
- 18.3k
- Forks
- 2k
- Merge medio
- 2 d 12 h
- PR fusionados (30 d)
- 28
Descripción
Description
When using violinmode: 'group' with violins at multiple x-axis categories, but without offsetgroup set, the width calculation uses the total number of traces across the entire plot instead of the number of traces at each x-position. This causes excessive empty space even when gap parameters are set to 0.
Screenshots/Video
Steps to reproduce
<!DOCTYPE html>
<html>
<head>
<!-- Load plotly.js into the DOM -->
<script src='https://cdn.plot.ly/plotly-3.1.2.js'></script>
</head>
<body>
<div id="myDiv"></div>
<script>
// Create data: 2 models × 3 evaluations = 6 traces total
// But at each x-position, there are only 2 violins
const models = ["Model A", "Model B"];
const evals = ["Eval 1", "Eval 2", "Eval 3"];
const colors = ["blue", "red"];
const traces = [];
models.forEach((model, modelIdx) => {
evals.forEach((evalName, evalIdx) => {
const yData = Array.from({length: 50}, () =>
Math.random() * 2 - 1 + modelIdx
);
traces.push({
type: 'violin',
x: Array(50).fill(evalName),
y: yData,
name: model,
legendgroup: model,
scalegroup: model,
// offsetgroup: model, // Uncomment to fix spacing
showlegend: evalIdx === 0,
line: { color: colors[modelIdx] }
});
});
});
const layout = {
violinmode: 'group',
violingap: 0, // No gap between categories
violingroupgap: 0, // No gap between groups
title: 'Bug Demo: Excessive empty space despite gap=0'
};
Plotly.newPlot('myDiv', traces, layout);
</script>
</body>
</html>
Notes
Root Cause
I think the issue is in src/traces/box/cross_trace_calc.js.
When traces are split across multiple x-categories (each trace appears at only one x-value) but offsetgroup is not set, the formula incorrectly uses the global trace count numTotal:
var num = nOffsetGroups || numTotal;
...
bdPos = dPos * groupFraction * groupGapFraction / num;
This should divide by the number of traces at each specific x-position, not the total number of traces in the plot.
Workaround
Uncommenting offsetgroup: model, below scalegroup: model, in the above code produces the expected behaviour with no space between violins. See the below image:
However I don't believe this should be required - certainly it isn't mentioned in the docs.
Related
This probably also affects box plots since they share the width calculation logic in cross_trace_calc.js.
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza leyendo src/traces/box/cross_trace_calc.js y reproduce el ejemplo con seis trazas de violín, el modo agrupado y sin offsetgroup. Compara la asignación del ancho en cada posición x con el cálculo actual de las trazas globales y, después, verifica que el espaciado de las trazas de violín agrupadas coincida con la configuración de separación cero y considera si la lógica compartida de box-plot se ve afectada.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- javascript
- Área
- data-visualization
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bien especificado
- Aptitud para principiantes
- 58/100