JavaScript-Tutorial: Einfache Datenvisualisierung mit React-vis
Datenvisualisierung ist ein wichtiger Bestandteil des Erzählens von Geschichten, aber Sie können sich mit D3.js stundenlang im Unkraut verlieren, um nur ein paar einfache Diagramme zu erstellen. Wenn Sie nur Diagramme benötigen, gibt es zahlreiche Bibliotheken, die D3 umschließen und Ihnen bequeme Möglichkeiten zum Erstellen einfacher Visualisierungen bieten. Diese Woche werden wir uns React-vis ansehen, eine Diagrammbibliothek, die Uber erstellt und als Open-Source-Version bereitgestellt hat.
React und d3.js haben eine interessante Beziehung. Bei React dreht sich alles um das deklarative Rendern von Komponenten, und bei D3.js geht es darum, DOM-Elemente unbedingt zu manipulieren. Die gemeinsame Verwendung ist mit ref
s möglich , aber es ist viel besser, den gesamten Manipulationscode in einer separaten Komponente zu kapseln, damit Sie nicht so oft den Kontext wechseln müssen. Glücklicherweise erledigt die React-vis-Bibliothek dies bereits für uns mit einer Reihe von zusammensetzbaren Komponenten, mit denen wir unsere Visualisierungen erstellen können.
Der beste Weg, um Datenvisualisierungsbibliotheken oder wirklich jede Bibliothek zu testen, besteht darin, etwas damit zu erstellen. Lassen Sie uns dies anhand des Datensatzes "Beliebte Babynamen" der Stadt New York tun.
Vorbereiten der Daten für React-vis
Zu Beginn habe ich ein React-Projekt mit create-react-app
einigen Abhängigkeiten gebootet und hinzugefügt: react-vis, d3-fetch
um das Abrufen der CSV-Daten und moment
das Formatieren des Datums zu erleichtern. Ich habe auch ein bisschen Boilerplate-Code zusammengestellt, um die CSV zu ziehen und zu analysieren, die die populären Namen enthält d3-fetch
. Im JSON-Format hat der Datensatz, den wir abrufen, ungefähr 11.000 Zeilen und jeder Eintrag sieht folgendermaßen aus:
{"Geburtsjahr": "2016",
"Geschlecht Weiblich",
"Ethnizität": "ASIATISCHER UND PAZIFISCHER INSEL",
"Vorname des Kindes": "Olivia",
"Count": "172",
"Rang 1"
}}
Da die Leerzeichen in den Schlüsseln und die als Zeichenfolgen dargestellten Zahlen die Arbeit mit diesen Daten erschweren würden, ändern wir die Daten beim Laden, um sie zu massieren. Dieser Code verwendet einfach die dsv
Methode von d3-fetch
:
{dsv} aus 'd3-fetch' importieren;Moment von 'Moment' importieren;
dsv (",", dataUrl, (d) => {
Rückkehr {
Geburtsjahr: + d ['Geburtsjahr'],
Geschlecht: d ['Geschlecht'],
ethnische Zugehörigkeit: d ['ethnische Zugehörigkeit'],
Vorname: d ['Vorname des Kindes'],
count: + d ['Count'],
Rang: + d ['Rang'],
};
});
Jetzt sind unsere Eingabedaten viel freundlicher. Es sieht aus wie das:
{"Jahr der Geburt": 2016,
"Geschlecht Weiblich",
"ethnische Zugehörigkeit": "ASIAN AND PACIFIC ISLANDER",
"Vorname": "Olivia",
"count": 172,
"Rang 1
}}
Unser erstes Grundstück mit React-vis
Die erste Komponente, die Sie wahrscheinlich verwenden, ist eine Form einer XYPlot
, die andere Komponenten enthält und in fast jedem von Ihnen erstellten Diagramm vorhanden ist. Dies ist meist nur ein Wrapper, der die Größe der Visualisierung definiert, kann jedoch einige Eigenschaften enthalten, die auch an untergeordnete Elemente übergeben werden. Rendert an sich XYPlot
nur einen leeren Raum:
width = {300}
Höhe = {300}
>
Um Daten tatsächlich anzuzeigen, müssen wir eine Reihe von Daten verwenden. Eine Serie ist die Komponente, die die Daten tatsächlich zeichnet, z. B. ein vertikales Balkendiagramm ( VerticalBarSeries
) oder ein Liniendiagramm ( LineSeries
). Wir haben sofort 14 Serien zur Verfügung, aber wir beginnen mit einer einfachen VerticalBarSeries
. Jede Serie erbt von einem Basissatz von Attributen. Das nützlichste für uns wird das data
Attribut sein:
width = {300}
Höhe = {300}
>
data = {data}
/>
Dies wird jedoch fehlschlagen, da React-vis erwartet, dass die Elemente im Datenarray die folgende Form haben:
{x: 2016, // Dies wird der x-Achse zugeordnet
y: 4 // Dies wird auf die y-Achse abgebildet
}}
Um beispielsweise die Gesamtzahl der im Datensatz gezählten Babys nach Jahr anzuzeigen, müssen die Daten verarbeitet werden, um ein einzelnes Objekt für jedes Jahr zu erhalten, in dem das x
Attribut das Jahr und das y
Attribut die Gesamtzahl der Babys ist der Datensatz. Der Code, den ich dazu geschrieben habe, ist ziemlich knapp:
const totalBabiesByYear = Object.entries (data.reduce ((acc, row) => {if (row.yearOfBirth in acc) {
acc [row.yearOfBirth] = acc [row.yearOfBirth] + row.count
} else {
acc [row.yearOfBirth] = row.count
}}
return acc;
}, {})). map (([k, v]) => ({x: + k, y: v}));
Wenn Sie es an das anschließen VerticalBarSeries
, erhalten wir einige Ergebnisse!

Dies ist für sich genommen nicht besonders hilfreich, aber zum Glück bietet die React-vis-Bibliothek einige zusätzliche Komponenten, mit denen die Informationen kontextualisiert werden können. Lassen Sie uns Import XAxis
und YAxis
so können wir mehr Informationen in unserer Tabelle anzuzeigen. Wir werden diese Komponenten XYPlot
neben uns rendern VerticalBarSeries
. Der Code und die Ergebnisse sehen folgendermaßen aus:
width = {600}
Höhe = {600}
>
data = {totalBabiesByYear}
/>

Unsere Beschriftungen auf der y-Achse sind abgeschnitten und unsere Beschriftungen auf der x-Achse werden als Zahlen formatiert, aber wir machen Fortschritte. Um die x-Achse als diskrete Ordnungswerte im Gegensatz zu einem kontinuierlichen numerischen Bereich zu behandeln, fügen wir xType="ordinal"
als Eigenschaft die hinzu XYPlot
. Während wir gerade dabei sind, können wir dem Diagramm einen linken Rand hinzufügen, damit wir mehr Beschriftungen der y-Achse sehen können:
width = {600}
Höhe = {600}
margin = {{
links: 70
}}
xType = "ordinal"
>

Wir sind im Geschäft! Unser Diagramm sieht bereits gut aus - und die meisten Arbeiten, die wir ausführen mussten, betrafen das Massieren von Daten, nicht das Rendern.
Nächste Woche werden wir die Komponenten der React-vis-Bibliothek weiter untersuchen und einige grundlegende Interaktionen definieren. Schauen Sie sich dieses Projekt auf GitHub an, wenn Sie mit dem Datensatz und der React-vis-Bibliothek herumspielen möchten. Hast du irgendwelche Visualisierungen, die du mit React-vis gemacht hast? Senden Sie mir einen Screenshot auf Twitter @freethejazz.