Lösung für die bearbeitete Frage. Sie können Ihre Daten zwei Serien zuordnen und die Stapelung auf "normal" setzen.
const data = [10, 20, -10, 20, 10, -10];
const dataPositive = data.map(v => v >= 0 ? v : 0);
const dataNegative = data.map(v => v < 0 ? v : 0);
const options = {
chart: {
type: 'column'
},
series: [{
color: 'blue',
data: dataPositive,
stacking: 'normal'
}, {
color: 'orange',
data: dataNegative,
stacking: 'normal'
}]
}
const chart = Highcharts.chart('container', options);
anschauliches Beispiel: https://jsfiddle.net/j2o5bdgs/
[EDIT]
Lösung für Grafik Wasserfall:
const data = [10, 20, -30];
const colors = Highcharts.getOptions().colors;
const options = {
chart: {
type: 'waterfall'
},
series: [{
// Single series simulating 2 series
data: data.map(v => v < 0 ? {
y: v,
color: colors[0]
} : {
y: v,
color: colors[3]
}),
stacking: 'normal',
showInLegend: false
}, {
// Positive data serie
color: colors[3],
data: [10, 20, 0],
visible: false,
stacking: 'normal',
showInLegend: false
}, {
// Negative data serie
color: colors[0],
data: [0, 0, -30],
visible: false,
stacking: 'normal',
showInLegend: false
}, {
// Empty serie for legend item
name: 'Series 1',
color: colors[3],
stacking: 'normal',
events: {
legendItemClick: function(e) {
const series = this.chart.series;
const invisibleCount = document.querySelectorAll('.highcharts-legend-item-hidden').length;
if (this.visible) {
if (invisibleCount === 1) {
series[0].hide();
series[1].hide();
series[2].hide();
} else {
series[0].hide();
series[2].show();
}
} else if (invisibleCount === 2) {
series[0].hide();
series[1].show();
} else {
series[0].show();
series[2].hide();
}
}
}
}, {
// Empty serie for legend item
name: 'Series 2',
color: colors[0],
stacking: 'normal',
events: {
legendItemClick: function(e) {
const series = this.chart.series;
const invisibleCount = document.querySelectorAll('.highcharts-legend-item-hidden').length;
if (this.visible) {
if (invisibleCount === 1) {
// hide all
series[0].hide();
series[1].hide();
series[2].hide();
return;
}
series[0].hide();
series[1].show();
} else {
if (invisibleCount === 2) {
series[0].hide();
series[2].show();
return;
}
series[0].show();
series[1].hide();
}
}
}
}]
}
const chart = Highcharts.chart('container', options);
anschauliches Beispiel: https://jsfiddle.net/2uszoLop/
Eine andere Frage, vielleicht nicht in den Anwendungsbereich von th Die Frage, die diskutiert wird, ist diese Anforderung * obligatorisch * für einen Wasserfalldiagrammanbieter? –
während die Antwort akzeptabel ist, ist seine Eleganz dennoch zweifelhaft, danke trotzdem. –
Ich bin mir nicht sicher, was Sie mit Ihrer Frage meinen. Wenn Sie meinen, tut irgendeine andere Diagrammbibliothek, was Sie nativ wollen, fürchte ich, ich kenne die Antwort nicht. In Bezug auf Eleganz - die elegantere Lösung ist die zweite, die ich erwähnte - bauen Sie die Legende selbst. – jlbriggs