# Axios与ECharts进行数据可视化案例
*数据分析案例*
文章《 Axios 与 ECharts 进行 数据可视化 案例》主要介绍如何使用 Axios 和 ECharts 两个开源工具进行 数据可视化。演示了如何使用 Axios 处理数据,并使用 ECharts 创建图表来进行数据可视化。
## 目录
[TOC]
## echarts使用

### 绘制柱状图
#### 准备一个HTML存储图表
首先我们要了解一些有关前端的知识,在前端中,HTML的标签能够存储住一些东西,这些东西可能是一些形状,也可能是一些图像或视频,而有趣的问题就在这里,echarts创建的图表是生成在哪里的呢?
是的,它的图表生成在HTML的控件中,因此,在使用echarts之前,我们需要创建出一个控件,就像下面这样
```html
<div id='echarts_div_em' style="width: 1024px; height: 512px">
<!-- 这里就是存储echarts 图表的元素 不知道你有没有注意到我给它设置了一个id,一会你就知道它怎么用啦 -->
</div>
```
#### 准备 JS 脚本 开始进行可视化操作
##### 引入echarts
在这里,我们要回顾一些知识,js文件是可以在外界引入到HTML文件中,进而被使用的,echarts这个框架其本质就是一个JS脚本文件,我们只需要将这个JS进行引入,下面就是在html中引入echarts的操作。
```html
<!-- 在这里就是将 echarts 的脚本引入进来了 需要注意的是这里涉及到服务器的网络传输,可能会导致echarts可视化失败,建议下载到本地,放到自己的项目中! -->
<script src="http://www.lingyuzhao.top/js/lib/echarts/echarts.min.js"></script>
<div id='echarts_div_em' style="width: 1024px; height: 512px">
</div>
```
##### 使用echarts进行可视化
echarts的前期准备工作已经差不多,接下来就是更加具体的可视化操作了,echarts的可视化大概有这样的几个步骤。
1 创建图表实例:首先,你需要在HTML文档中创建一个用于容纳ECharts图表的容器元素,例如一个div元素。然后,你可以使用ECharts提供的echarts.init()方法来初始化图表实例,并将其与容器元素关联起来。例如:
```JavaScript
// 获取容器元素 TODO 注意这里哦!这个元素是用来存储图表的,还记着前面说到的 id 吗,就是它!用id告诉echarts将图表存储在哪里!
const chartDom = document.getElementById('echarts_div_em');
// 初始化图表实例 这个示例其实就是图表对象 但是现在没有图,因为还没有设置数据呢,至于图怎么出来呢,继续往下看!
const myChart = echarts.init(chartDom);
```
2 设置图表配置项:通过调用setOption()方法,可以为图表实例设置各种配置项,包括标题、图例、坐标轴、数据等。这些配置项可以在ECharts提供的选项对象中进行定义,而这些就是json格式!例如:
```JavaScript
// 创建配置项对象
const option = {
title: {
text: 'ECharts 示例'
},
tooltip: {},
legend: {
data:['销量']
},
xAxis: {
data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
},
yAxis: {},
series: [{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}]
};
// 设置图表配置项
myChart.setOption(option);
```
上面的脚本中就是设置了一个柱状图,x横轴为["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"],数据为[5, 20, 36, 10, 10, 20],经过这里,图应该就已经出现啦,下面是完整代码。
#### 完整的HTML文件
直接复制,保存为HTML文件,然后打开就可以了哦!!
```html
<!DOCTYPE HTML>
<html lang="ch-zn">
<head>
<title>Title</title>
<meta charset="GBK">
</head>
<body>
<!-- 在这里就是将 echarts 的脚本引入进来了 -->
<script rel="script" type="text/javascript" src="http://www.lingyuzhao.top/js/lib/echarts/echarts.min.js"></script>
<div id='echarts_div_em' style="width: 1024px; height: 512px">
<!-- 这里就是存储echarts 图表的元素 不知道你有没有注意到我给它设置了一个id,一会你就知道它怎么用啦 -->
</div>
</body>
</html>
<script>
window.onload = () => {
// 获取容器元素 TODO 注意这里哦!这个元素是用来存储图表的,还记着前面说到的 id 吗,就是它!用id告诉echarts将图表存储在哪里!
const chartDom = document.getElementById('echarts_div_em');
// 初始化图表实例 这个示例其实就是图表对象 但是现在没有图,因为还没有设置数据呢,至于图怎么出来呢,继续往下看!
const myChart = echarts.init(chartDom);
// 创建配置项对象
const option = {
title: {
text: 'ECharts 示例'
},
tooltip: {},
legend: {
data:['销量']
},
xAxis: {
data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
},
yAxis: {},
series: [{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}]
};
// 设置图表配置项
myChart.setOption(option);
}
</script>
```
### json数据装载到echarts
#### 前期准备
实际的开发中,我们往往要使用一些框架来向后端服务器索要数据,然后才可以进行数据的可视化操作,在这里我们将会使用本网站中热度数据的获取接口:[[点击前往]专题热度数据接口][1]
下面就是获取到的后端数据,其中的 "TOPIC_CALORIFIC_FRACTION" 代表了热度数据,这是一个json数据格式,可以访问[《前端 json 对象数据处理方法汇总》][2]文章了解到 json 数据相关的知识!
```json
{
"topics": [
{
"id": 79268899,
"userId": 1,
"topicName": "网站公告",
"TOPIC_CALORIFIC_FRACTION": 7000076
},
{
"id": 17055036,
"userId": 1,
"topicName": "正则表达式",
"TOPIC_CALORIFIC_FRACTION": 65
},
{
"id": 88842223,
"userId": 1,
"topicName": "数据分析案例",
"TOPIC_CALORIFIC_FRACTION": 54
},
{
"id": 20619125,
"userId": 1,
"topicName": "曲谱分享",
"TOPIC_CALORIFIC_FRACTION": 49
},
{
"id": -44879746,
"userId": 1,
"topicName": "原神",
"TOPIC_CALORIFIC_FRACTION": 29
},
{
"id": -1426659,
"userId": 4,
"topicName": "文章所属专题",
"TOPIC_CALORIFIC_FRACTION": 3
},
{
"id": 0,
"userId": 1,
"topicName": "默认专题栏目",
"TOPIC_CALORIFIC_FRACTION": 1
},
{
"id": 83499744,
"userId": 1,
"topicName": "hudi数据湖",
"TOPIC_CALORIFIC_FRACTION": 1
}
],
"RES": "ok!!!!"
}
```
#### 引入 axios
axios 其本身也是一个库,就像echarts一样,我们需要通过下面的操作将这个库引入进来。
```html
<script rel="script" type="text/javascript" src="http://lsf.lingyuzhao.top:8080/LS-WebFront/js/lib/axios.min.js"></script>
```
#### 开始使用axios获取到json
我们通过axios发起请求,并在其then方法内设置回调函数,以便更好地处理获取到的json数据。但请注意,示例中使用的url具有跨域保护措施,因此您需要将您的本地IP映射为以 "lingyuzhao.top" 结尾的某个名字。如此一来,后端系统便不会阻止您获取数据,下面是被阻止之后的错误信息示例。
```
xxx.html:1 Access to XMLHttpRequest at 'http://lsb.lingyuzhao.top:8080/LS-WebBackEnd//articleController/getTop20TopicByHot' from origin 'http://localhost:63342' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
```
当然,您也可以使用其它的url实现json数据的获取,有关如何配置 ip 映射,请访问[《配置hosts文件以实现IP映射》](http://www.lingyuzhao.top/?/linkController=/articleController&link=-80651947)
```html
<script rel="script" type="text/javascript" src="http://lsf.lingyuzhao.top:8080/LS-WebFront/js/lib/axios.min.js"></script>
<script>
// 调用axios库
axios(
{
// 在这里设置自己的后端接口地址就可以啦
url : 'http://lsb.lingyuzhao.top:8080/LS-WebBackEnd//articleController/getTop20TopicByHot'
}
).then(
(res) => {
res = res.data;
// 在这里的res就是数据了,在这里可以针对这个数据进行任意的使用。可以使用打印的方式将json数据打印出来
console.info(res)
}
)
</script>
```
此时,您可以打开您的F12终端,就可以看到json数据啦!
### axios 对接 echarts 进行可视化
到现在为止,我们了解了axios如何进行json数据的获取,也了解了如何使用echarts进行可视化,但是我们并没有了解如何将axios的数据装载到echarts中,现在就开始讲解相关知识!
#### 导入相关库
还是和之前一样,我们将两个库导入进来,就像下面一样。
```javaScript
<script rel="script" type="text/javascript" src="http://lsf.lingyuzhao.top:8080/LS-WebFront/js/lib/axios.min.js"></script>
<script rel="script" type="text/javascript" src="js/echarts.min.js"></script>
```
这样可以确保我们能够使用这两个框架,接下来,我们需要将 axios 访问后端接口的代码写出来!!
#### axios接入后端
这里的操作和之前演示的也是一样的哦!
```javaScript
// 调用axios库
axios(
{
// 在这里设置自己的后端接口地址就可以啦
url : 'http://lsb.lingyuzhao.top:8080/LS-WebBackEnd//articleController/getTop20TopicByHot'
}
).then(
(res) => {
res = res.data;
}
)
```
#### 将获取到的json进行处理
重点来啦!我们知道后端的数据并不能够直接装载给echarts ,因为结构不一样,所以在这里我们起始就是做一个结构转换的操作,echarts需要数据的列表,以及数据对应的名字的列表,因此我们需要将这两个参数提取出来,提取方式就在下面哦!
```javaScript
res = res.data;
// 在这里的res就是数据了,在这里我们将数据中的指标提取出来
// 创建一个用来存储数据的list
const dataList = [];
// 创建一个用来存储所有name的list 其中的元素要与dataList中的对应起来
const nameList = [];
// 开始提取所有数据的list
const re = res['topics'];
for (let i = 0; i < re.length; i++) {
// 在这里的就是一个数据 数据的格式如下显示
/*{
"id": 数据的id,
"userId": 专题创建者id,
"topicName": 专题名称,
"TOPIC_CALORIFIC_FRACTION": 专题热度
}*/
const reElement = re[i];
// 而我们在这里要建立的可视化图 数据的名字为 专题名称 统计的数据为热度 所以需要像下面一样进行提取
if (reElement.topicName !== '网站公告') {
// 不过由于网站公告的专题热度太高了,让其它的数据在图表上变化不明显,所以我们在这里不将网站公告的数据加进去
dataList.push(reElement.TOPIC_CALORIFIC_FRACTION)
nameList.push(reElement.topicName)
}
}
```
#### 将数据装载给 echarts
这里也是最后一步啦,我们直接将提取好的list 放在echarts配置中的对应位置,就像下面一样,到这里,图表就出现了!
```
// 获取容器元素 TODO 注意这里哦!这个元素是用来存储图表的,还记着前面说到的 id 吗,就是它!用id告诉echarts将图表存储在哪里!
const chartDom = document.getElementById('echarts_div_em');
// 初始化图表实例 这个示例其实就是图表对象 但是现在没有图,因为还没有设置数据呢,至于图怎么出来呢,继续往下看!
const myChart = echarts.init(chartDom);
// 创建配置项对象
const option = {
title: {
text: 'ECharts 示例'
},
tooltip: {},
legend: {
data:['热度']
},
xAxis: {
data: nameList
},
yAxis: {},
series: [{
name: '热度',
type: 'line',
data: dataList
}]
};
// 设置图表配置项
myChart.setOption(option);
```
#### 完整代码
```html
<!DOCTYPE HTML>
<html lang="ch-zn">
<head>
<title>Title</title>
<meta charset="GBK">
</head>
<body>
<!-- 在这里就是将 echarts 的脚本引入进来了 -->
<div id='echarts_div_em' style="width: 1024px; height: 512px">
<!-- 这里就是存储echarts 图表的元素 不知道你有没有注意到我给它设置了一个id,一会你就知道它怎么用啦 -->
</div>
</body>
</html>
<script rel="script" type="text/javascript" src="http://lsf.lingyuzhao.top:8080/LS-WebFront/js/lib/axios.min.js"></script>
<script rel="script" type="text/javascript" src="js/echarts.min.js"></script>
<script>
// 调用axios库
axios(
{
// 在这里设置自己的后端接口地址就可以啦
url : 'http://lsb.lingyuzhao.top:8080/LS-WebBackEnd//articleController/getTop20TopicByHot'
}
).then(
(res) => {
res = res.data;
// 在这里的res就是数据了,在这里我们将数据中的指标提取出来
// 创建一个用来存储数据的list
const dataList = [];
// 创建一个用来存储所有name的list 其中的元素要与dataList中的对应起来
const nameList = [];
// 开始提取所有数据的list
const re = res['topics'];
for (let i = 0; i < re.length; i++) {
// 在这里的就是一个数据 数据的格式如下显示
/*{
"id": 数据的id,
"userId": 专题创建者id,
"topicName": 专题名称,
"TOPIC_CALORIFIC_FRACTION": 专题热度
}*/
const reElement = re[i];
// 而我们在这里要建立的可视化图 数据的名字为 专题名称 统计的数据为热度 所以需要像下面一样进行提取
if (reElement.topicName !== '网站公告') {
// 不过由于网站公告的专题热度太高了,让其它的数据在图表上变化不明显,所以我们在这里不将网站公告的数据加进去
dataList.push(reElement.TOPIC_CALORIFIC_FRACTION)
nameList.push(reElement.topicName)
}
}
// 获取容器元素 TODO 注意这里哦!这个元素是用来存储图表的,还记着前面说到的 id 吗,就是它!用id告诉echarts将图表存储在哪里!
const chartDom = document.getElementById('echarts_div_em');
// 初始化图表实例 这个示例其实就是图表对象 但是现在没有图,因为还没有设置数据呢,至于图怎么出来呢,继续往下看!
const myChart = echarts.init(chartDom);
// 创建配置项对象
const option = {
title: {
text: 'ECharts 示例'
},
tooltip: {},
legend: {
data:['热度']
},
xAxis: {
data: nameList
},
yAxis: {},
series: [{
name: '热度',
type: 'line',
data: dataList
}]
};
// 设置图表配置项
myChart.setOption(option);
}
)
</script>
```
#### 最终的话
恭喜你呀,到这里,我们已经已经成功的复现出了一个简单的可视化,从`<html>`标签开始写,到现在能够处理json数据,很大的进步!这也是你的入门案例,后面的学习路线可能会很崎岖,但要保持开心!
## 更多案例
### 文章均值与总数的折柱混图可视化
#### 题目描述
访问 http://lsb.lingyuzhao.top:8080/LS-WebBackEnd//articleController/getAll?nowRow=0&count=200 后端接口连接,其会返回文章的数据,要求将每个 articleTopic 对应的文章的浏览量平均数 以及浏览量总和 获取到,并进行可视化操作
#### 获取到后端数据
```javaScript
axios(
{
url : "http://lsb.lingyuzhao.top:8080/LS-WebBackEnd//articleController/getAll?nowRow=0&count=200",
}
).then(
(res) => {
res = res.data;
}
)
```
#### 获取到均值计算需要的数据
由于我们要计算均值 所以在这里需要进行 每个 articleTopic 文章的数量的计算,以及每个 articleTopic 对应的文章的浏览量总数,因此处理逻辑如下所示。
```flow
st=>start: 文章 json 对象设为 json
cond=>condition: 当前对象的articleTopic不存在于json中
opt0=>operation: 创建以articleTopic为key的json对象
opt1=>operation: 创建{count:0, sum:0}分别代表文章数量以及浏览量之和
opt2=>operation: 提取articleTopic属性
opt3=>operation: 提取count(浏览量)属性,累加到json.articleTopic.sum,实现文章浏览量累加
opt4=>operation: 对于json.articleTopic.count属性 进行 +1 的操作,实现文章计数
opt5=>operation: json.articleTopic.sum/json.articleTopic.count 即为均值!
e=>end: 处理完毕
cond(yes)->opt0->opt1->opt2->opt3->opt4->opt5->e
cond(no)->opt2
```
因此实现逻辑如下所示
```JavaScript
res = res.data;
// 准备 专题数据存储 json 容器 其中 key 是专题id value 是专题的浏览量和文章量
let json = {}
// 将 json 数据的 trends_all 属性提取出来
let datasetElement = res['trends_all'];
// trends_all 属性对应的是一个列表,列表中包含的就是文章 因此我们在这里直接迭代列表即可
for (let i = 0; i < datasetElement.length; i++) {
// 获取到每个文章 的 json
let obj = datasetElement[i];
// 判断当前文章的专题是否有被记录
if (json[obj['articleTopic']] === undefined) {
// 代表没有被记录 所以在这里我们初始化一下 这个专题对应的数据
json[obj['articleTopic']] = {
// 分别是文章的数量以及浏览量之和
"count": 0,
"sum": 0
}
}
// 开始进行累加
let jsonElement = json[obj['articleTopic']];
// 文章数量计数
jsonElement['count']++;
// 文章浏览量求和
jsonElement['sum'] += obj['count']
}
```
#### 计算均值以及可视化需要的数据
```javaScript
// 在这里计算出均值
// 并提取出 所有专题id 总和 以及 均值
let topic_all = []
let sum_all = []
let avg_all = []
for (let jsonKey in json) {
let jsonElement1 = json[jsonKey];
// 在这里我们将 {sum:x, count:y} 变为 {count:x, sum:y, avg:x/y}
jsonElement1['avg'] = jsonElement1['sum'] / jsonElement1['count']
// 将专题 id 提供给 topic_all
topic_all.push(jsonKey)
// 然后将总和数量提供给 sum_all
sum_all.push(jsonElement1['sum'])
// 将均值数量提供给均值
avg_all.push(jsonElement1['avg'])
}
```
#### 进行可视化
```javaScript
// 获取到需要被做为图表的容器
let show = document.getElementById("show");
// 获取到 echarts 实例
let myChart = echarts.init(show);
let option;
option = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
crossStyle: {
color: '#999'
}
}
},
toolbox: {
feature: {
dataView: {show: true, readOnly: false},
magicType: {show: true, type: ['line', 'bar']},
restore: {show: true},
saveAsImage: {show: true}
}
},
legend: {
data: ['Evaporation', 'Precipitation', 'Temperature']
},
xAxis: [
{
type: 'category',
// 设置 图表的维度 按照专题分维度 所以这里是专题的id json 的 key 正是专题的id
data: topic_all,
axisPointer: {
type: 'shadow'
}
}
],
yAxis: [
{
type: 'value',
// 设置名字
name: '专题浏览量总和',
interval: 50,
axisLabel: {
formatter: '{value} ml'
}
},
{
type: 'value',
// 设置名字
name: '专题浏览量均值',
interval: 5,
axisLabel: {
formatter: '{value} °C'
}
}
],
series: [
{
name: '专题浏览量总和',
type: 'bar',
tooltip: {
valueFormatter: function (value) {
return value + ' ml';
}
},
data: sum_all
},
{
name: '专题浏览量均值',
type: 'line',
yAxisIndex: 1,
tooltip: {
valueFormatter: function (value) {
return value + ' °C';
}
},
data: avg_all
}
]
};
option && myChart.setOption(option);
```
### 完整代码
```HTML
<!DOCTYPE html>
<html lang="zh">
<meta charset="UTF-8">
<head>
<title>WebSocket Example</title>
</head>
<body>
<div id="show" style="width: 1024px; height: 512px">
</div>
<script rel="script" src="js/lib/axios.min.js" type="text/javascript"></script>
<script rel="script" src="js/echarts.min.js" type="text/javascript"></script>
<script>
axios(
{
url: "http://lsb.lingyuzhao.top:8080/LS-WebBackEnd//articleController/getAll?nowRow=0&count=200",
}
).then(
(res) => {
res = res.data;
// 准备 专题数据存储 json 容器 其中 key 是专题id value 是专题的浏览量和文章量
let json = {}
// 将 json 数据的 trends_all 属性提取出来
let datasetElement = res['trends_all'];
// trends_all 属性对应的是一个列表,列表中包含的就是文章 因此我们在这里直接迭代列表即可
for (let i = 0; i < datasetElement.length; i++) {
// 获取到每个文章 的 json
let obj = datasetElement[i];
// 判断当前文章的专题是否有被记录
if (json[obj['articleTopic']] === undefined) {
// 代表没有被记录 所以在这里我们初始化一下 这个专题对应的数据
json[obj['articleTopic']] = {
// 分别是文章的数量以及浏览量之和
"count": 0,
"sum": 0
}
}
// 开始进行累加
let jsonElement = json[obj['articleTopic']];
// 文章数量计数
jsonElement['count']++;
// 文章浏览量求和
jsonElement['sum'] += obj['count']
}
// 在这里计算出均值
// 并提取出 所有专题id 总和 以及 均值
let topic_all = []
let sum_all = []
let avg_all = []
for (let jsonKey in json) {
let jsonElement1 = json[jsonKey];
// 在这里我们将 {sum:x, count:y} 变为 {count:x, sum:y, avg:x/y}
jsonElement1['avg'] = jsonElement1['sum'] / jsonElement1['count']
// 将专题 id 提供给 topic_all
topic_all.push(jsonKey)
// 然后将总和数量提供给 sum_all
sum_all.push(jsonElement1['sum'])
// 将均值数量提供给均值
avg_all.push(jsonElement1['avg'])
}
// 获取到需要被做为图表的容器
let show = document.getElementById("show");
// 获取到 echarts 实例
let myChart = echarts.init(show);
let option;
option = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
crossStyle: {
color: '#999'
}
}
},
toolbox: {
feature: {
dataView: {show: true, readOnly: false},
magicType: {show: true, type: ['line', 'bar']},
restore: {show: true},
saveAsImage: {show: true}
}
},
legend: {
data: ['Evaporation', 'Precipitation', 'Temperature']
},
xAxis: [
{
type: 'category',
// 设置 图表的维度 按照专题分维度 所以这里是专题的id json 的 key 正是专题的id
data: topic_all,
axisPointer: {
type: 'shadow'
}
}
],
yAxis: [
{
type: 'value',
// 设置名字
name: '专题浏览量总和',
interval: 50,
axisLabel: {
formatter: '{value} ml'
}
},
{
type: 'value',
// 设置名字
name: '专题浏览量均值',
interval: 5,
axisLabel: {
formatter: '{value} °C'
}
}
],
series: [
{
name: '专题浏览量总和',
type: 'bar',
tooltip: {
valueFormatter: function (value) {
return value + ' ml';
}
},
data: sum_all
},
{
name: '专题浏览量均值',
type: 'line',
yAxisIndex: 1,
tooltip: {
valueFormatter: function (value) {
return value + ' °C';
}
},
data: avg_all
}
]
};
option && myChart.setOption(option);
}
)
</script>
</body>
</html>
```
=未完待续=
[1]: http://lsb.lingyuzhao.top:8080/LS-WebBackEnd//articleController/getTop20TopicByHot "后端数据接口链接"
[2]: http://www.lingyuzhao.top/?/linkController=/articleController&link=-28687176 "前端 json 对象数据处理方法汇总"
----
相关文章
- [《前端 json 对象数据处理方法汇总》](http://www.lingyuzhao.top/?/linkController=/articleController&link=-28687176 "《JavaScript 中的数据类型以及常见的数据处理手段》")
- [《JavaScript 中的数据类型以及常见的数据处理手段》](http://www.lingyuzhao.top/?/linkController=/articleController&link=15581853 "《JavaScript 中的数据类型以及常见的数据处理手段》")
- [《Axios与ECharts进行数据可视化案例》](http://www.lingyuzhao.top/?/linkController=/articleController&link=-15471917 "《Axios与ECharts进行数据可视化案例》")
------
***操作记录***
作者:[root](http://www.lingyuzhao.top//index.html?search=1 "root")
操作时间:2023-12-02 16:43:06 星期六
事件描述备注:保存/发布
[](如果不需要此记录可以手动删除,每次保存都会自动的追加记录)