Wie handhaben Schichten mit fehlenden Datenpunkten in d3.layout.stack()
Ich bin mit d3.stack erstellen Sie ein gestapeltes Flächendiagramm, aber ich bekomme einen Fehler wenn ich nicht eine gleiche Anzahl der Elemente in jeder Schicht. Ich fange mit einer Reihe von Daten wie diese:
[
{key:'Group1',value,date},
{key:'Group1',value,date},
{key:'Group1',value,date},
{key:'Group2',value,date},
{key:'Group2',value,date}
]
und nachdem ich es durch nest() und stack() ich am Ende mit diesem format, wie erwartet:
[
{key: 'Group1',
values: [ {key,value,date}, {key,value,date}, {key,value,date} ] },
{key: 'Group2',
values: [ {key,value,date}, {key,value,date} ] }
]
Habe ich leicht modifiziert, eine gestapelte Fläche-Beispiel um zu demonstrieren das Problem in diesem jsFiddle: http://jsfiddle.net/brentkeller/rTC3c/2/
Wenn Sie entfernen eine der Datenpunkte in den sourceData-Arrays Sie sehen die Fehlermeldung "Cannot read property '1' of undefined " in der Konsole.
Ist es ein Weg, um d3.stack nur annehmen, null-Werte für die fehlenden Daten Punkte? Wenn nicht, gibt es eine elegante Lösung, um füllen Sie die fehlenden Werte?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist nicht d3 spezifische, sondern eine Allgemeine Lösung für das füllen von Lücken in einer Reihe von eingegeben Daten. Ich veränderte Ihre jsfiddle hier mit der folgenden Funktion:
Geht es durch den gegebenen Datensatz und, Wann immer es geht über eine neue
date
Wert, wird ein Standardwert allekeys
noch nicht gesehen.nest()
zu schaffen, eine Struktur Verbrauchsmaterial vonstack()
. Ich kann verstehen, dass die Herausforderungen, mit, dass, obwohl, aber es wäre unglaublich hilfreich.Stack nicht wirklich, was es sagt, das stapeln von Graphen, so dass Sie als Nutzer sind verantwortlich für die Bereitstellung der Daten in das richtige format. Dies macht Sinn, wenn man darüber nachdenkt, denn stack ist im Grunde Daten, die format-agnostisch. Es bietet eine große Flexibilität, mit der einzigen Einschränkung, dass für jede Schicht kann auf die gleiche Anzahl von Punkten. Wie wäre es zu bestimmen, welche Punkte fehlen? Gegeben, dass die erste Schicht hatte die fünf Punkte und die zweite Schicht hat zehn Punkte, ist die erste Ebene, die fehlenden fünf Punkte? Oder sind beide Ebenen fehlende Punkte, weil eine Dritte Schicht enthält noch mehr Punkte. Und dann wenn die Punkte fehlen, welche? Am Anfang, am Ende, irgendwo in der Mitte? Wieder gibt es keine vernünftige Möglichkeit für eine stack-Implementierung, um dies herauszufinden (es sei denn, es zwingen würde, sehr starre Datenstrukturen).
So, aber es ist nichts, was man tun kann? Ich denke, man kann. Ich kann nicht geben Sie eine vollständige Umsetzung kann aber geben Ihnen einige Hinweise in die richtige Richtung. Wir beginnen hier:
Hier einfach nur wieder die Werte, die in deinem Beispiel wird das Ergebnis der nest-operator. So an diesem Punkt haben Sie die Möglichkeit, zu "reparieren" die Werte.
Das erste, was Sie tun müssen, ist die Bestimmung der maximalen Anzahl der Beobachtungen.
Nun kam der schwierige Teil. Sobald Sie wissen, die maximale Anzahl der Elemente, die Sie brauchen, anpassen
die Funktion, die übergeben Werte. Hier müssen Sie Ihre Annahmen auf die Daten.
Von Ihnen Frage ich verstehe, dass für einige Gruppen, die Werte fehlen. Es gibt also zwei
Möglichkeiten. Entweder du davon ausgehen, dass die Gruppe mit der maximalen Anzahl von Elementen enthält alle Elemente, die in dem Bereich oder übernehmen Sie eine bestimmte Palette und überprüfen Sie alle Gruppen, wenn Sie
die Werte enthalten, für jeden "tick" in Ihrem Sortiment. Also, wenn Ihr Bereich ist ein Datum (wie in Ihrem
Beispiel) und Sie erwarten für jeden Tag (oder was auch immer-Intervall für diese Angelegenheit), eine Messung, Sie müssen zu Fuß die Elemente in der Gruppe und füllen die Lücken selbst. Ich werde versuchen (ungetestet) Beispiel für einen numerischen Bereich:
Wie gesagt, dieser Teil ist ungetestet und nicht direkt um Ihr problem zu lösen (wie ich es bin mit einem numerischen Bereich), aber ich denke, es sollte Ihnen eine Idee geben, wie Sie Ihr problem lösen (und was die eigentliche Quelle des Problems ist).
Wie andere bereits erklärt haben, wäre es unzumutbar für die gestapelten Diagramm zu raten, die fehlenden Werte für jeden Datenpunkt, weil es so viele Möglichkeiten zum interpolieren der Werte und es gibt keine offensichtliche Wahl.
Jedoch
d3.svg.line()
scheint bieten eine angemessene Möglichkeit für Sie zu wählen Ihre eigene Methode der interpolation und die fehlenden Werte. Während es entworfen ist, für die Erzeugung von SVG-Pfade, können Sie wahrscheinlich passen Sie es für die Definition von Linien im Allgemeinen. Interpolations-Methoden werden hier vorgeschlagen:https://github.com/mbostock/d3/wiki/SVG-Shapes#wiki-line_interpolate
Es ist bedauerlich, dass die Klasse, für jetzt, alle diese wunderbaren Interpolationsmethoden (dass nicht angezeigt, sonst nirgends in d3) aber beschränkt ist auf die Generierung von SVG-Pfad-Daten anstelle von beliebigen Zwischenwerte. Vielleicht, wenn @mbostock dies sieht, wird er denken wird, verallgemeinern die Funktionalität.
Jedoch, für jetzt können Sie nur wollen, machen ein fork von d3 und nehmen Sie das Zwischenergebnis
line(data)
bevor es geschrieben wird, um eine SVG -path
string, in dem Teil der Quelle, dass der interpolation, unter: