[BUG]: Violin plot width incorrectly calculated in grouped mode with multiple x-categories
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- JavaScript
- Sterne
- 18.3k
- Forks
- 2k
- Ø Merge
- 2 T. 12 Std.
- Gemergte PRs (30 T.)
- 28
Beschreibung
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.
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Lies zunächst src/traces/box/cross_trace_calc.js und reproduziere das Beispiel mit sechs Violin-Traces, dem gruppierten Modus und ohne offsetgroup. Vergleiche die Breitenzuweisung an jeder x-Position mit der aktuellen globalen Trace-Berechnung. Überprüfe anschließend, ob der Abstand der gruppierten Violin-Traces den Einstellungen für null Lücken entspricht, und prüfe, ob die gemeinsam genutzte Box-Plot-Logik betroffen ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- javascript
- Bereich
- data-visualization
- Issue-Typ
- Bug
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Klar beschrieben
- Anfängerfreundlichkeit
- 58/100