346 lines
9.1 KiB
Vue
346 lines
9.1 KiB
Vue
|
|
<template>
|
|||
|
|
<div class="age_distribution">
|
|||
|
|
<div :id="id"></div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
<script>
|
|||
|
|
import * as echarts from "echarts";
|
|||
|
|
import "echarts-gl";
|
|||
|
|
export default {
|
|||
|
|
name: "AgeDistricolumn",
|
|||
|
|
props: {
|
|||
|
|
xData: {
|
|||
|
|
type: Array,
|
|||
|
|
required: true
|
|||
|
|
},
|
|||
|
|
seriesData: {
|
|||
|
|
type: Array,
|
|||
|
|
required: true
|
|||
|
|
},
|
|||
|
|
config: {
|
|||
|
|
type: Object,
|
|||
|
|
default: () => {
|
|||
|
|
return {
|
|||
|
|
bottom: "22%"
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
className: {
|
|||
|
|
type: String,
|
|||
|
|
default: "tooltip-box"
|
|||
|
|
},
|
|||
|
|
id: {
|
|||
|
|
type: String,
|
|||
|
|
default: "column"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
x: [],
|
|||
|
|
series: []
|
|||
|
|
};
|
|||
|
|
},
|
|||
|
|
watch: {
|
|||
|
|
xData: {
|
|||
|
|
handler: function (newVal) {
|
|||
|
|
this.x = newVal;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
seriesData: {
|
|||
|
|
handler: function (newVal) {
|
|||
|
|
this.series = newVal;
|
|||
|
|
this.getPeople();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
mounted() {},
|
|||
|
|
methods: {
|
|||
|
|
// 柱图
|
|||
|
|
getPeople() {
|
|||
|
|
const offsetX = 10;
|
|||
|
|
const offsetY = 5;
|
|||
|
|
// 绘制左侧面
|
|||
|
|
const CubeLeft = echarts.graphic.extendShape({
|
|||
|
|
shape: {
|
|||
|
|
x: 0,
|
|||
|
|
y: 0
|
|||
|
|
},
|
|||
|
|
buildPath: function (ctx, shape) {
|
|||
|
|
// 会canvas的应该都能看得懂,shape是从custom传入的
|
|||
|
|
const xAxisPoint = shape.xAxisPoint;
|
|||
|
|
// console.log(shape);
|
|||
|
|
const c0 = [shape.x, shape.y];
|
|||
|
|
const c1 = [shape.x - offsetX, shape.y - offsetY];
|
|||
|
|
const c2 = [xAxisPoint[0] - offsetX, xAxisPoint[1] - offsetY];
|
|||
|
|
const c3 = [xAxisPoint[0], xAxisPoint[1]];
|
|||
|
|
ctx
|
|||
|
|
.moveTo(c0[0], c0[1])
|
|||
|
|
.lineTo(c1[0], c1[1])
|
|||
|
|
.lineTo(c2[0], c2[1])
|
|||
|
|
.lineTo(c3[0], c3[1])
|
|||
|
|
.closePath();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
// 绘制右侧面
|
|||
|
|
const CubeRight = echarts.graphic.extendShape({
|
|||
|
|
shape: {
|
|||
|
|
x: 0,
|
|||
|
|
y: 0
|
|||
|
|
},
|
|||
|
|
buildPath: function (ctx, shape) {
|
|||
|
|
const xAxisPoint = shape.xAxisPoint;
|
|||
|
|
const c1 = [shape.x, shape.y];
|
|||
|
|
const c2 = [xAxisPoint[0], xAxisPoint[1]];
|
|||
|
|
const c3 = [xAxisPoint[0] + offsetX, xAxisPoint[1] - offsetY];
|
|||
|
|
const c4 = [shape.x + offsetX, shape.y - offsetY];
|
|||
|
|
ctx
|
|||
|
|
.moveTo(c1[0], c1[1])
|
|||
|
|
.lineTo(c2[0], c2[1])
|
|||
|
|
.lineTo(c3[0], c3[1])
|
|||
|
|
.lineTo(c4[0], c4[1])
|
|||
|
|
.closePath();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
// 绘制顶面
|
|||
|
|
const CubeTop = echarts.graphic.extendShape({
|
|||
|
|
shape: {
|
|||
|
|
x: 0,
|
|||
|
|
y: 0
|
|||
|
|
},
|
|||
|
|
buildPath: function (ctx, shape) {
|
|||
|
|
const c1 = [shape.x, shape.y];
|
|||
|
|
const c2 = [shape.x + offsetX, shape.y - offsetY]; //右点
|
|||
|
|
const c3 = [shape.x, shape.y - offsetX];
|
|||
|
|
const c4 = [shape.x - offsetX, shape.y - offsetY];
|
|||
|
|
ctx
|
|||
|
|
.moveTo(c1[0], c1[1])
|
|||
|
|
.lineTo(c2[0], c2[1])
|
|||
|
|
.lineTo(c3[0], c3[1])
|
|||
|
|
.lineTo(c4[0], c4[1])
|
|||
|
|
.closePath();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
// 注册三个面图形
|
|||
|
|
echarts.graphic.registerShape("CubeLeft", CubeLeft);
|
|||
|
|
echarts.graphic.registerShape("CubeRight", CubeRight);
|
|||
|
|
echarts.graphic.registerShape("CubeTop", CubeTop);
|
|||
|
|
|
|||
|
|
var myChart = echarts.init(document.getElementById(this.id));
|
|||
|
|
let bottom = "22%";
|
|||
|
|
let top = "9%";
|
|||
|
|
if (this.config.bottom) {
|
|||
|
|
bottom = this.config.bottom;
|
|||
|
|
}
|
|||
|
|
if (this.config.top) {
|
|||
|
|
top = this.config.top;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let option = {
|
|||
|
|
tooltip: {
|
|||
|
|
trigger: "axis",
|
|||
|
|
axisPointer: {
|
|||
|
|
type: "shadow"
|
|||
|
|
},
|
|||
|
|
padding: 0,
|
|||
|
|
className: this.className,
|
|||
|
|
formatter: function (params) {
|
|||
|
|
const item = params[1];
|
|||
|
|
return `
|
|||
|
|
<div class="tooltip-item">
|
|||
|
|
<div class="uqn"></div>
|
|||
|
|
<div class="toolTipName">${item.name}</div>
|
|||
|
|
<div class="toolTipValue">${item.value}</div>
|
|||
|
|
</div>
|
|||
|
|
`;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
grid: {
|
|||
|
|
left: "0%",
|
|||
|
|
right: "0%",
|
|||
|
|
top: top,
|
|||
|
|
bottom: bottom,
|
|||
|
|
containLabel: true
|
|||
|
|
},
|
|||
|
|
xAxis: {
|
|||
|
|
type: "category",
|
|||
|
|
data: this.x,
|
|||
|
|
axisLine: {
|
|||
|
|
show: true,
|
|||
|
|
lineStyle: {
|
|||
|
|
width: 2,
|
|||
|
|
color: "rgba(186, 231, 255, 0.6)" //轴线颜色
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
axisTick: {
|
|||
|
|
show: false
|
|||
|
|
},
|
|||
|
|
axisLabel: {
|
|||
|
|
fontSize: 14,
|
|||
|
|
textStyle: {
|
|||
|
|
color: "rgba(230, 247, 255, 1)" //轴字体色
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
yAxis: {
|
|||
|
|
type: "value",
|
|||
|
|
splitNumber: 4, //分割段数,需要注意的是这个分割段数只是个预估值
|
|||
|
|
minInterval: 1, //最小间隔
|
|||
|
|
axisLine: {
|
|||
|
|
show: false,
|
|||
|
|
lineStyle: {
|
|||
|
|
width: 2,
|
|||
|
|
color: "rgba(186, 231, 255, 1)"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
splitLine: {
|
|||
|
|
show: true,
|
|||
|
|
lineStyle: {
|
|||
|
|
color: "rgba(255, 255, 255, 0.12)"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
axisTick: {
|
|||
|
|
show: false
|
|||
|
|
},
|
|||
|
|
axisLabel: {
|
|||
|
|
fontSize: 12,
|
|||
|
|
textStyle: {
|
|||
|
|
color: "rgba(230, 247, 255, 1)" //轴字体色
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
series: [
|
|||
|
|
{
|
|||
|
|
type: "custom",
|
|||
|
|
renderItem: (params, api) => {
|
|||
|
|
const location = api.coord([api.value(0), api.value(1)]);
|
|||
|
|
return {
|
|||
|
|
type: "group",
|
|||
|
|
children: [
|
|||
|
|
{
|
|||
|
|
type: "CubeLeft",
|
|||
|
|
shape: {
|
|||
|
|
api,
|
|||
|
|
xValue: api.value(0),
|
|||
|
|
yValue: api.value(1),
|
|||
|
|
x: location[0],
|
|||
|
|
y: location[1],
|
|||
|
|
xAxisPoint: api.coord([api.value(0), 0])
|
|||
|
|
},
|
|||
|
|
style: {
|
|||
|
|
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|||
|
|
{
|
|||
|
|
offset: 0,
|
|||
|
|
color: "rgba(133, 200, 255, 1)"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
offset: 1,
|
|||
|
|
color: "rgba(133, 200, 255, 0.1)"
|
|||
|
|
}
|
|||
|
|
])
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
type: "CubeRight",
|
|||
|
|
shape: {
|
|||
|
|
api,
|
|||
|
|
xValue: api.value(0),
|
|||
|
|
yValue: api.value(1),
|
|||
|
|
x: location[0],
|
|||
|
|
y: location[1],
|
|||
|
|
xAxisPoint: api.coord([api.value(0), 0])
|
|||
|
|
},
|
|||
|
|
style: {
|
|||
|
|
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|||
|
|
{
|
|||
|
|
offset: 0,
|
|||
|
|
color: "rgba(133, 200, 255, 1)"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
offset: 1,
|
|||
|
|
color: "rgba(133, 200, 255, 0.1)"
|
|||
|
|
}
|
|||
|
|
])
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
type: "CubeTop",
|
|||
|
|
shape: {
|
|||
|
|
api,
|
|||
|
|
xValue: api.value(0),
|
|||
|
|
yValue: api.value(1),
|
|||
|
|
x: location[0],
|
|||
|
|
y: location[1],
|
|||
|
|
xAxisPoint: api.coord([api.value(0), 0])
|
|||
|
|
},
|
|||
|
|
style: {
|
|||
|
|
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|||
|
|
{
|
|||
|
|
offset: 0,
|
|||
|
|
color: "rgba(201, 225, 254, 1)"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
offset: 1,
|
|||
|
|
color: "rgba(201, 225, 254, 1)"
|
|||
|
|
}
|
|||
|
|
])
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
};
|
|||
|
|
},
|
|||
|
|
data: this.series
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
type: "bar",
|
|||
|
|
label: {
|
|||
|
|
normal: {
|
|||
|
|
show: false,
|
|||
|
|
position: "top",
|
|||
|
|
formatter: (e) => {
|
|||
|
|
return e.value + "条";
|
|||
|
|
},
|
|||
|
|
fontSize: 13,
|
|||
|
|
color: "#43C4F1",
|
|||
|
|
offset: [0, 0]
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
itemStyle: {
|
|||
|
|
color: "transparent"
|
|||
|
|
},
|
|||
|
|
tooltip: {},
|
|||
|
|
data: this.series
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
};
|
|||
|
|
myChart.setOption(option);
|
|||
|
|
// 让图表自适应容器大小
|
|||
|
|
window.addEventListener("resize", function () {
|
|||
|
|
myChart.resize();
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
.age_distribution {
|
|||
|
|
position: relative;
|
|||
|
|
width: 100%;
|
|||
|
|
height: 100%;
|
|||
|
|
#column {
|
|||
|
|
z-index: 3;
|
|||
|
|
width: 90%;
|
|||
|
|
height: 80%;
|
|||
|
|
margin-top: 10%;
|
|||
|
|
margin-left: 5%;
|
|||
|
|
}
|
|||
|
|
#column1 {
|
|||
|
|
z-index: 3;
|
|||
|
|
width: 90%;
|
|||
|
|
height: 80%;
|
|||
|
|
margin-top: 10%;
|
|||
|
|
margin-left: 5%;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|