使用微信小程序开发可视化效果 使用echarts和ec-canvas标签实现,数据的结构为 // 定义数据结构 let data = { '地区': { '广东': { '未上过学': { '合计': 100, '男': 50, '女': 50 }, '小学': { '合计': 400, '男': 200, '女': 200 }, // ...其他受教育程度 }, '广西': { '未上过学': { '合计': 50, '男': 25, '女': 25 }, '小学': { '合计': 500, '男': 250, '女': 250 }, // ... } } }; 实现一个柱状图当中的多Y轴堆叠柱折柱混合,y轴为人数,x轴为受教育程度。柱状图根据(性别和地区)两个指标分不同颜色,比如广东男为颜色1,广东女为颜色2,广西男为颜色3,广西女为颜色4,柱子为(同一个地区同一受教育程度)堆叠在同一个柱子,比如未上过学广东男和未上过学广东女两个柱子堆叠在一起。折线为不同地区用不同颜色区分,比如广西为折线1颜色1,广东为折线2颜色2,每一个点为(这个地区的这个学历)男女人数的合计数,比如折线2的第一个点是未上过学广东男的人数加上未上过学广东女的人数,请写出示例代码
时间: 2024-01-31 08:03:03 浏览: 149
微信小程序ec-canvas
以下是示例代码:
```html
<view class="container">
<ec-canvas id="mychart-dom-multi" canvas-id="mychart-multi" ec="{{ ec }}"></ec-canvas>
</view>
```
```javascript
import * as echarts from '../../ec-canvas/echarts';
function initChart(canvas, width, height, dpr) {
const chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: dpr // 像素比
});
canvas.setChart(chart);
const data = {
'地区': {
'广东': {
'未上过学': {
'合计': 100,
'男': 50,
'女': 50
},
'小学': {
'合计': 400,
'男': 200,
'女': 200
},
// ...其他受教育程度
},
'广西': {
'未上过学': {
'合计': 50,
'男': 25,
'女': 25
},
'小学': {
'合计': 500,
'男': 250,
'女': 250
},
// ...
}
}
};
const legendData = []; // 图例数据
const seriesData = []; // 数据
for (const area in data.地区) {
let maleData = []; // 男性数据
let femaleData = []; // 女性数据
let maleTotal = 0; // 男性总数
let femaleTotal = 0; // 女性总数
for (const education in data.地区[area]) {
const value = data.地区[area][education]['合计'];
const maleValue = data.地区[area][education]['男'];
const femaleValue = data.地区[area][education]['女'];
maleTotal += maleValue;
femaleTotal += femaleValue;
maleData.push(maleValue);
femaleData.push(femaleValue);
}
legendData.push(area);
seriesData.push({
name: area,
type: 'line',
yAxisIndex: area.indexOf('广东') > -1 ? 0 : 1, // 广东为第一个y轴,其他地区为第二个y轴
data: [maleTotal, femaleTotal],
symbol: 'circle', // 折线图数据点形状
symbolSize: 8, // 折线图数据点大小
itemStyle: {
color: area.indexOf('广东') > -1 ? '#ff0000' : '#00ff00' // 广东为红色,其他地区为绿色
}
}, {
name: area + '男',
type: 'bar',
stack: 'male',
data: maleData,
itemStyle: {
color: area.indexOf('广东') > -1 ? '#ff8080' : '#00b200' // 广东男为红色,其他地区男为绿色
}
}, {
name: area + '女',
type: 'bar',
stack: 'female',
data: femaleData,
itemStyle: {
color: area.indexOf('广东') > -1 ? '#ff0040' : '#00e600' // 广东女为红色,其他地区女为绿色
}
});
}
const option = {
color: ['#ff8080', '#ff0040', '#00b200', '#00e600'], // 柱子颜色
legend: {
data: legendData,
textStyle: {
color: '#666' // 图例文字颜色
}
},
grid: {
top: '10%',
left: '5%',
right: '5%',
bottom: '10%',
containLabel: true
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
xAxis: {
type: 'category',
data: ['未上过学', '小学', '其他受教育程度'], // x轴数据
axisTick: {
alignWithLabel: true
}
},
yAxis: [{
type: 'value',
name: '男性人数',
nameTextStyle: {
color: '#666' // y轴名称颜色
},
axisLabel: {
formatter: '{value}'
},
splitLine: {
show: false
}
}, {
type: 'value',
name: '女性人数',
nameTextStyle: {
color: '#666'
},
axisLabel: {
formatter: '{value}'
},
splitLine: {
show: false
}
}],
series: seriesData
};
chart.setOption(option);
return chart;
}
Page({
data: {
ec: {
onInit: initChart
}
}
});
```
阅读全文