אחד הפיצ'רים החמודים של echarts הוא היכולת להריץ Data Pipeline בתוך קוד יצירת הגרף. אני מודה שאני עדיין מתלבט מתי להשתמש בזה ומתי להריץ את המניפולציה על המידע מראש, במיוחד כשמשלבים את echarts עם ספריית פרונטאנד כמו ריאקט או ויו. בכל מקרה ובינתיים בשביל המשחק בואו נראה איך זה עובד. שימו לב להגדרת המידע הבאה:
dataset: [
{
// 1) Raw data from your JSON array
id: 'raw',
source: data
},
{
// 2) Sort descending by SUMACCIDEN
id: 'sorted',
fromDatasetId: 'raw',
transform: {
type: 'sort',
config: {
dimension: 'SUMACCIDEN', // the field to sort by
order: 'desc'
}
}
},
],
אני מתחיל עם מערך של אוביקטים בשם data, ובמקום למיין אותו מראש בקוד אני משתמש בטרנספורמציה של echarts כדי להסתכל על המידע הממוין. היתרון הוא שאפשר לייצר טרנספורמציות שונות ולהציג גרפים אחרים לכל טרנספורמציה, או לחבר את הטרנספורמציות למערכת ניהול האירועים של echarts.
החיסרון הוא שהתיעוד לא מלהיב ואם צריכים טרנספורמציה שאין להם זה יכול לתסכל. לדוגמה לא מצאתי דרך להציג רק 10 ערכים גבוהים ביותר אחרי הסינון.
האלטרנטיבה היא להשתמש ב JavaScript פשוט ואז יש לנו גם הרבה יותר גמישות, לדוגמה הקוד הבא מארגן את הנתונים ומאחד שורות כשיש מספר שורות לאותה עיר, וגם לוקח את עשרת הערים עם הכי הרבה תאונות:
const sortedData = _.chain(data)
.filter(item => item.city && item.SUMACCIDEN)
.groupBy('city')
.mapValues(v => _.sumBy(v, item => item.SUMACCIDEN))
.toPairs()
.orderBy(p => p[1], 'desc')
.value()
.slice(0, 10)
ייתרון נוסף של הגישה הפשוטה הוא שלא חייבים לטעון את רכיב הטרנספורמציות, מה שמקטין את הבאנדל.
דוגמה? בטח. הקוד הבא יציג לכם את עשר הערים עם הכי הרבה תאונות דרכים בספטמבר 2024 ומספר תאונות הדרכים בכל עיר בגרף עמודות:
<script setup>
import { use } from 'echarts/core';
import { CanvasRenderer } from 'echarts/renderers';
import { BarChart } from 'echarts/charts';
import _ from 'lodash';
import {
TitleComponent,
TooltipComponent,
LegendComponent,
GridComponent,
DatasetComponent,
} from 'echarts/components';
import VChart from 'vue-echarts';
import { ref } from 'vue';
// Register only the components we need (modular import)
use([
CanvasRenderer,
BarChart,
TitleComponent,
TooltipComponent,
LegendComponent,
GridComponent,
DatasetComponent,
]);
// Fetch your JSON array of objects (converted from CSV)
const data = await fetch('https://assets.codepen.io/5217/data.json').then(res => res.json());
window.data = data;
const sortedData = _.chain(data)
.filter(item => item.city && item.SUMACCIDEN)
.groupBy('city')
.mapValues(v => _.sumBy(v, item => item.SUMACCIDEN))
.toPairs()
.orderBy(p => p[1], 'desc')
.value()
.slice(0, 10)
const option = ref({
title: {
text: 'Top 10 Cities with Car Accidents',
left: 'center'
},
tooltip: {
trigger: 'axis'
},
// We use ECharts “dataset” + transforms for sorting and limiting to top 10
dataset: {
source: sortedData,
id: 'sorted'
},
xAxis: {
type: 'category'
},
yAxis: {
name: 'Number of Accidents'
},
series: [
{
type: 'bar',
datasetId: 'sorted',
// Optional styling
itemStyle: {
color: '#5470c6'
}
}
]
});
</script>
<template>
<!-- v-chart from vue-echarts -->
<v-chart class="chart" :option="option" autoresize />
</template>
<style scoped>
.chart {
height: 600px;
width: 100%;
}
</style>
בשביל להריץ תצטרכו לשים אותו בתוך תוכנית vue ולהתקין את vue-echarts ו echarts.
נ.ב. הפוסט במקור פורסם עם טעות. הוא נערך והתוכנית כעת מדפיסה את הגרף הנכון.