使用微信小程序开发可视化效果 使用echarts和ec-canvas标签实现,数据的结构为 // 定义数据结构 let data = { '地区': { '广东': { '未上过学': { '合计': 100, '男': 50, '女': 50 }, '小学': { '合计': 400, '男': 200, '女': 200 }, // ...其他受教育程度 }, '广西': { '未上过学': { '合计': 50, '男': 25, '女': 25 }, '小学': { '合计': 500, '男': 250, '女': 250 }, // ... } } }; 实现一个柱状图当中的折柱混合,根据性别和地区两个指标分不同颜色,柱子为同一个地区同一个学历的(男和女)堆叠在同一个柱子,折线为一个同一个地区同一个学历的合计数,y轴为人数,x轴为受教育程度,请写出示例代码
时间: 2024-01-21 10:03:07 浏览: 422
以下是示例代码,基于 echarts 和 ec-canvas 标签实现:
wxml 文件:
```html
<view class="container">
<ec-canvas id="mychart-dom-bar" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas>
</view>
```
js 文件:
```javascript
import * as echarts from '../../components/ec-canvas/echarts';
Page({
data: {
ec: {
lazyLoad: true // 延迟加载
}
},
onLoad: function () {
this.initChart();
},
// 初始化图表
initChart: function () {
this.selectComponent('#mychart-dom-bar').init((canvas, width, height, dpr) => {
// 初始化 echarts
const chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: dpr
});
// 设置数据
let data = {
'地区': {
'广东': {
'未上过学': {
'合计': 100,
'男': 50,
'女': 50
},
'小学': {
'合计': 400,
'男': 200,
'女': 200
},
// ...其他受教育程度
},
'广西': {
'未上过学': {
'合计': 50,
'男': 25,
'女': 25
},
'小学': {
'合计': 500,
'男': 250,
'女': 250
},
// ...
}
}
};
let legendData = ['男', '女', '合计'];
let xAxisData = Object.keys(data['地区']['广东']);
let seriesData = [];
// 循环添加数据
for (let i = 0; i < legendData.length; i++) {
let seriesItem = {
name: legendData[i],
type: 'bar',
stack: '总量',
itemStyle: {
color: i === 0 ? '#5470c6' : i === 1 ? '#91cc75' : '#fac858'
},
data: []
};
for (let j = 0; j < xAxisData.length; j++) {
let totalNum = 0;
if (data['地区']['广东'][xAxisData[j]]) {
totalNum += data['地区']['广东'][xAxisData[j]][legendData[i]];
}
if (data['地区']['广西'][xAxisData[j]]) {
totalNum += data['地区']['广西'][xAxisData[j]][legendData[i]];
}
seriesItem.data.push(totalNum);
}
seriesData.push(seriesItem);
}
// 添加折线图数据
for (let i = 0; i < xAxisData.length; i++) {
let totalNum = 0;
if (data['地区']['广东'][xAxisData[i]]) {
totalNum += data['地区']['广东'][xAxisData[i]]['合计'];
}
if (data['地区']['广西'][xAxisData[i]]) {
totalNum += data['地区']['广西'][xAxisData[i]]['合计'];
}
seriesData.push({
name: '总人数',
type: 'line',
yAxisIndex: 1,
data: [totalNum],
itemStyle: {
color: '#f991b1'
}
});
}
// 设置图表选项
const option = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
legend: {
data: legendData
},
xAxis: {
type: 'category',
data: xAxisData
},
yAxis: [{
type: 'value',
name: '人数',
min: 0,
max: 600,
interval: 100,
axisLabel: {
formatter: '{value}'
}
}, {
type: 'value',
name: '总人数',
min: 0,
max: 1000,
interval: 200,
axisLabel: {
formatter: '{value}'
}
}],
series: seriesData
};
// 将图表选项设置到echarts中
chart.setOption(option);
// 将图表实例保存到this中方便其他方法调用
this.chart = chart;
return chart;
});
}
})
```
以上代码实现了一个折柱混合的柱状图,根据性别和地区两个指标分不同颜色,柱子为同一个地区同一个学历的(男和女)堆叠在同一个柱子,折线为一个同一个地区同一个学历的合计数,y轴为人数,x轴为受教育程度。
阅读全文