在数据科学飞速发展的当下,如何处理大规模数据并呈现给用户成为一种重要的挑战。这时候,可视化展示不仅能更好地呈现数据,同时能便捷地操作数据。而 Vue.js 框架作为当下热门的前端开发框架之一,成为实现千万级数据展示的有力工具。今天,让我们一起解析 Vue.js 技术中实现数据可视化的新思路和新方法吧!
准备工作
数据获取
我们可以使用 Vue.js 提供的 Axios 库来读取和提交数据请求。Axios 是一个基于 Promise 的 HTTP 库,可以用于客户端以浏览器和 node.js 的方式发起 HTTP 请求。
import axios from 'axios'
export default {
name: 'app',
data () {
return {
chartData: []
}
},
mounted() {
axios.get('http://your-api-url/chart-data')
.then((response) => {
this.chartData = response.data
})
.catch((error) => {
console.log(error)
})
}
}
复制代码
其中,data()
函数返回一个初始 chartData 数组,并在 mounted()
钩子函数中调用了一个 HTTP GET 请求,从 http://your-api-url/chart-data
的 URL 获得数据。收到的 JSON 数据被存放到名为 chartData
的变量中。
如果需要向 API 提交数据请求,可以使用类似的语法来发起 POST、PUT 和 DELETE 请求
axios.post('http://your-api-url/add-data', jsonData)
复制代码
其中,jsonData 是作为请求主体的 JSON 数据。你也可以实现图表中的事件(如,点击或缩放)从而向 API 发送请求
页面渲染
你可以使用很多的可视化 JavaScript 库,来展示数据视图,例如 Chart.js、Highcharts 等库都是流行的选择。我们这里以 Chart.js 作为范例,通过 Vue.js 条件渲染的方式来在视图中渲染图表。
首先,需要为应用程序添加 Chart.js 库。你可以下载和外部引用一个版本,或者直接通过 CDN 在模板 HTML 文件中引入,如下所示
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js" integrity="sha256-Hm/GL79AMLYYuzIDnr+zij3Gu7RIev+a99CUz/eKt/s=" crossorigin="anonymous"></script>
</head>
复制代码
然后,你需要在 Vue 组件中创建渲染图表的 HTML 元素,并添加 Chart.js 数据与事件绑定,如下所示
<template>
<div>
<canvas ref="canvas"></canvas>
</div>
</template>
<script>
export default {
data() {
return {
chartData: null
};
},
mounted() {
this.renderChart();
},
methods: {
renderChart() {
let ctx = this.$refs.canvas.getContext("2d");
let data = this.chartData;
new window.Chart(ctx, {
type: "line",
data: {
labels: data.labels,
datasets: [
{
label: "Line chart dataset",
data: data.datasets[0].data
}
]
}
});
}
}
};
</script>
复制代码
设计响应
为了优化 Vue.js 的响应性能,并使图表数据在不同的设备和屏幕上显示得更好,请为视图添加媒体查询,并使用适当的组件库和工具进行设计。
你可以引入第三方 CSS 框架,如 Bootstrap 和 Bulma,以加快响应性设计开发的节奏。
另一个值得了解的是选用处理过的屏幕上所使用界面的前端框架。假设开发界面时使用了处理应将从业务功能中解放出来的 CSS 块。随着界面设置的变化,该框架能使 CSS 设置变得更加明了,总体而言,UI 样式工作就更好地与项目业务分离。
此外,当处理浏览器窗口或屏幕宽度变化中特定的 CSS 设置行为时,选用类似于 Vue.js 的库非常合适,因为它们足够深入每个模块,方便处理界面组件的状态变化。
数据可视化
图表类型
Vue.js 与其他 JavaScript 库一样,支持各种可视化图表类型,包括线图、柱图、饼图等。不同的 JavaScript 库可能有各自的 Vue.js 官方支持插件,请结合所选的库自行了解其具体文档。
值得一提的是,Vue.js 的 ECharts 扩展库曾经是中文社区内很受欢迎的一种常规可视化处理方式。ECharts 高级样式和方法超出了标准的 SVG 和画布 API 调用,并提供了直观的图表自定义支持
这里列举一个简单的图表实现的例子
<template>
<bar-chart :data="barData"/>
</template>
<script>
import BarChart from "@/components/BarChart.vue";
export default {
name: "DemoPage",
components: {
BarChart,
},
data() {
return {
barData: [
{value: 50, date: "2020-07-20"},
{value: 10, date: "2020-07-21"},
{value: 80, date: "2020-07-22"},
{value: 30, date: "2020-07-23"},
{value: 60, date: "2020-07-24"},
]
};
},
};
</script>
复制代码
其中,BarChart
组件是一个专门实现并插入一个柱状图的 Vue.js 组件
图表的组件和实现
根据数据类型和应用需求,通常需要选择不同的 SVG 渲染方式和 D3.js 绘图方法来渲染和绘制数据图表。而且,D3.js 是一个基于 SVG 细节绘制模型的库,可让你高度定制和使用常见的可视化和简单操作元素以支持输入类型。
例如,可以添加以下基于 D3.js 和 SVG 的元素
<template>
<div>
<svg width="1000" height="800">
<g v-for="(item, index) in dataset" :transform="translate(index)" :key="index">
<rect :x="padding.left" :y="yScale(item.data)" width="30" :height="height - padding.bottom - yScale(item.data)"/>
<text :x="padding.left + 15" :y="yScale(item.data) - 5">{{item.data}}</text>
<text class="bar-chart__label" :x="padding.left" :y="(height - padding.bottom/2 + 14)" style="transform:rotateY(180deg);">{{item.name}}</text>
</g>
</svg>
</div>
</template>
<script>
export default {
props: ['dataset', 'height', 'padding', 'min-value', 'max-value'],
computed: {
yScale() {
let [minValue, maxValue] = [this.maxValue, this.minValue];
if (typeof minValue !== 'number' || typeof maxValue !== 'number') {
let valueArr = this.dataset.map(function (item) {
return item.data;
});
minValue = Math.min.apply(null, valueArr);
maxValue = Math.max.apply(null, valueArr);
let range = maxValue - minValue;
return ((d) => (this.height - this.padding.bottom - (d - minValue) / range * (this.height - this.padding.bottom - this.padding.top)));
}
},
methods: {
translate(index) {
let tranWidth = index * 50 + this.padding.left;
return 'translate(' + tranWidth + ',' + (this.height - this.padding.bottom) + ')';
}
},
};
</script>
复制代码
在这里,我们创建了名为 BarChart 的 Vue.js 组件,它使用了基于 D3.js 和 SVG 的元素来呈现柱状图。在该实现中,我们可以根据 height,padding 和 minValue/maxValue 改变图表样式,并通过 dataset 数组定义要呈现的数据。
数据分配和过滤
Vue.js 与 JavaScript 库的组合通常使用数据对象和过滤器的方式来分配和过滤数据。
例如,我们可以使用 Vue.js 官方的 [].filter() 方法来维护定义数据:
export default {
name: "App",
data() {
return {
data: [
{ day: "Monday", hour: 1, value: 40 },
{ day: "Monday", hour: 2, value: 30 },
...
],
};
},
computed() {
days: () => [
"Monday",
"Tuesday",
...
"Sunday",
],
weekData() {
return this.days.map(day => {
return {
day,
data: this.data.filter(item => item.day === day)
}
})
}
}
}
复制代码
在我们上面的代码中引入了 Array 类别中的 [].filter 方法,通过日志数据中属性筛选出数据集。days 计算属性使用了 this.data 来提取输入数据值中不同的元素,包括了所有的唯一类型的 day,现在,weekData 数据为元素数据 day 的一个子集,并且在其经由依照天分类汇总处理之后可以使用在其他状态,例如可视化呈现,算法处理等等。
数据交互
图标元素的交互
Vue.js 可以使你通过组件和状态来控制用户与可视化图表的交互能力。例如,你可以利用 Vue.js props/emit 传递方式将元素交互控制 UI 分发为需要移动端还是桌面端时使用,这可以帮助你开发适应不同类型屏幕上的不同用例应用程序。我们推荐你所选的数据可视化插件与组件来学习组件并实现使用场景交互。
事件处理能力
Vue.js 提供了全套的事件 API 来帮助创建各类用户交互。该事件 API 命名为 V-on,你可以通过它来处理点击、滚动、拖拽、键盘按下、移动端的指针事件和触控事件等。
文档参考:Handling User Input with v-bind and v-on
除此之外,你还可以探索 addEventListener 等浏览器原生事件方法,或者利用 Vue.js 插件与第三方库集成来实现更高级或更具体的交互需求。
过滤和选择
在数据交互过程中,过滤和选择功能很常见。我们可以利用 JavaScript 或 Vue.js 手动编写样式或 UI 组件来满足具体需求,比如选中特定的对象等。查阅 Vue.js 官方文档了解更多关于数据过滤的信息,请参考 https://vuejs.org/guide/essentials/list.html。同时在“针对 Vue 的数据”指南页面有更多项目推荐和收录了通过使用 Vue.js 来处理数据所开发的应用程序,体验可以作为模板也可以提前用于评估基础概念掌握状况并帮助我们更好地了解 Vue.js。
一个简单的根据条件筛选的代码示例
<template>
<table>
<thead>
<tr>
<th>Name</th>
<th>Age</th>
</tr>
<tr>
<td><input type="text" v-model="searchName"></td>
<td><input type="text" v-model="searchAge"></td>
</tr>
</thead>
<tbody>
<tr v-for="person in searchPeople" :key="person.id">
<td>{{person.name}}</td>
<td>{{person.age}}</td>
</tr>
</tbody>
</table>
</template>
<script>
export default {
data() {
return {
people: [
{ id: 1, name: "Alice", age: 25 },
{ id: 2, name: "Bob", age: 30 },
{ id: 3, name: "Charlie", age: 40 },
],
searchName: '',
searchAge: '',
};
},
computed() {
searchPeople() {
let filterName = this.searchName ? this.searchName.trim().toLowerCase() : null;
let filterAge = this.searchAge ? this.searchAge.trim().toLowerCase() : null;
if (!filterName && !filterAge) return this.people;
return this.people.filter(function (p) {
let matches = true;
if (filterName) {
matches = matches && (p.name.toLowerCase().indexOf(filterName) !== -1);
}
if (filterAge) {
matches = matches && (p.age.toString().toLowerCase().indexOf(filterAge) !== -1);
}
return matches;
});
},
}
}
</script>
复制代码
应用案例
在本案例中,我们将采用 Vue.js 和 ECharts.js 来构建一个可交互的千万级数据可视化 Dashboard。
数据准备 首先,我们需要根据我们的需求,准备有效的数据。在本案例中,我们将使用一些模拟数据。
数据分析与可视化 我们可以使用 ECharts.js 作为我们的可视化工具。它支持各种类型的图表,例如折线图,散点图,饼图等等。我们可以根据我们的需要,使用这些图表来进行数据分析和可视化。
首先,我们需要引入 ECharts.js 并创建 ECharts 实例:
import echarts from 'echarts'
var myChart = echarts.init(document.getElementById('chart'))
复制代码
然后,我们可以通过 myChart.setOption 方法创建我们需要的图表,并向图表中添加数据:
myChart.setOption({
title: { text: '千万级数据可视化' },
tooltip: {},
xAxis: {
...
},
yAxis: {
...
},
series: [{
type: 'line',
data: [820, 932, 901, 934, 120, 1320, 2300, 4300, 5500, 9100, 12100, 14300, 19100, 21000, 24000],
...
}]
})
复制代码
接下来,我们可以通过 Vue.js 来实现页面交互。例如,我们可以通过列表、过滤器、分页等等来方便地控制我们在页面上所展示的数据。
性能优化 由于我们的数据量非常庞大,因此必须考虑性能问题。我们可以采用一些提高性能的技巧,例如:
AJAX 数据获取:在必要的时候只获取我们所需的数据。
图表加载时机:只在需要的时候再加载图表。初始化时不要加载所有图表。
图表重绘机制:减少我们在数据更新时不必要的图表重绘。
数据缓存:使用缓存,将常用的数据保存在内存中,不必每次都重新加载。
通过这些技巧,我们可以有效地提高我们的应用性能
评论