数据可视化是现代前端开发中的重要环节,而ECharts作为一款强大的可视化库,能够帮助开发者快速实现复杂的图表需求。本文将以两个实际案例(年份-数量统计和评分-数量统计)为例,详细讲解如何在ECharts中配置横纵坐标、处理数据排序及优化图表样式,并提供完整的代码实现。
category vs value)从后端接口获取数据后,需按年份升序排序:
// 假设接口返回数据格式
res = [
{ year: "2020", total: 200 },
{ year: "2018", total: 120 },
{ year: "2022", total: 250 }
];
// 按年份升序排序(处理字符串类型的年份)
res.sort((a, b) => parseInt(a.year) - parseInt(b.year));category 类型)value 类型)let xAxis = res.map(item => item.year); // 年份
let yAxis = res.map(item => parseFloat(item.total)); // 数量var option = {
title: {
text: '年代统计',
left: 'center'
},
tooltip: {
trigger: 'axis',
formatter: '{b} : {c} 部' // 提示框显示年份和数量
},
xAxis: {
type: 'category',
data: xAxis,
axisLabel: { rotate: 45 }, // 标签旋转避免重叠
name: '年份'
},
yAxis: {
type: 'value',
name: '数量(部)'
},
series: [{
data: yAxis,
type: 'bar',
barWidth: '60%',
itemStyle: { color: '#5470C6' }
}],
grid: {
bottom: '20%' // 为横坐标标签留出空间
}
};2018, 2020, 2022120, 200, 2502018 : 120 部从后端接口获取数据后,按评分升序排序:
// 假设接口返回数据格式
res = [
{ pingfen: 8.5, total: 120 },
{ pingfen: 7.0, total: 90 }
];
// 按评分升序排序(处理浮点数)
res.sort((a, b) => a.pingfen - b.pingfen);value 类型)category 类型)let xAxis = res.map(item => parseFloat(item.total)); // 数量
let yAxis = res.map(item => item.pingfen); // 评分var option = {
title: {
text: '评分统计',
left: 'center'
},
tooltip: {
trigger: 'axis',
formatter: '{b} 分 : {c} 部' // 提示框显示评分和数量
},
xAxis: {
type: 'value',
name: '数量(部)'
},
yAxis: {
type: 'category',
data: yAxis,
name: '评分'
},
series: [{
data: xAxis,
type: 'bar',
barWidth: '60%',
itemStyle: { color: '#91CC75' }
}],
grid: {
left: '15%' // 调整纵坐标标签位置
}
};90, 1207.0, 8.57.0 分 : 90 部category:用于离散的分类数据(如年份、评分)value:用于连续的数值数据(如数量)// 通用排序函数(处理数字或字符串)
function sortData(data, key) {
return data.sort((a, b) => parseFloat(a[key]) - parseFloat(b[key]));
}标签旋转:避免横坐标标签重叠
axisLabel: { rotate: 45 }边距调整:防止标签超出容器
grid: { bottom: '20%', left: '15%' }提示框格式化:
formatter: '{b} : {c} 部' // {b} 为坐标轴标签,{c} 为数值dianyingxinxiChat1() {
this.$nextTick(() => {
const chart = echarts.init(document.getElementById("dianyingxinxiChart1"), 'macarons');
this.$http.get("dianyingxinxi/group/year").then(({ data }) => {
if (data.code === 0) {
const res = data.data.sort((a, b) => parseInt(a.year) - parseInt(b.year));
const option = {
xAxis: { data: res.map(item => item.year) },
yAxis: { /* 数值轴配置 */ },
series: [{ data: res.map(item => item.total) }]
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
}
});
});
}dianyingxinxiChat2() {
this.$nextTick(() => {
const chart = echarts.init(document.getElementById("dianyingxinxiChart2"), 'macarons');
this.$http.get("dianyingxinxi/group/pingfen").then(({ data }) => {
if (data.code === 0) {
const res = data.data.sort((a, b) => a.pingfen - b.pingfen);
const option = {
yAxis: { data: res.map(item => item.pingfen) },
xAxis: { /* 数值轴配置 */ },
series: [{ data: res.map(item => item.total) }]
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
}
});
});
}现象:排序结果异常
解决:统一转换为数值类型
parseFloat(a.year) - parseFloat(b.year)现象:标签显示不全
解决:调整布局边距
grid: { left: '20%', right: '10%', bottom: '30%' }itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#2378f7' }, // 渐变颜色
{ offset: 1, color: '#83bff6' }
])
}通过本文的实践,我们可以掌握以下技能:
category或valueECharts的强大之处在于其灵活的配置项,开发者可通过官方文档(Apache ECharts)深入探索更多高级功能,如异步数据加载、交互事件等,以满足复杂业务场景的需求。