|
@@ -0,0 +1,253 @@
|
|
|
+<template>
|
|
|
+ <div class="chart" :id="id"></div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import util from "@/helper/util.js";
|
|
|
+import partten from "@/helper/partten.js";
|
|
|
+import * as echarts from "echarts";
|
|
|
+
|
|
|
+export default {
|
|
|
+ name: "multiple-bar-chart",
|
|
|
+ componentName: "multiple-bar-chart",
|
|
|
+ props: {
|
|
|
+ width: {
|
|
|
+ type: String,
|
|
|
+ default: "100%",
|
|
|
+ },
|
|
|
+ height: {
|
|
|
+ type: String,
|
|
|
+ default: "800px",
|
|
|
+ },
|
|
|
+ // 传入数据
|
|
|
+ bardata: {
|
|
|
+ type: Object,
|
|
|
+ default: () => {
|
|
|
+ return {
|
|
|
+ area: ["风场1", "风场2", "风场3", "风场4", "风场5", "风场6", "风场7", "风场8", "风场9"],
|
|
|
+ legend: ["实际电量", "计划检修损失", "非计划检修损失", "限电损失", "受累损失", "性能损失"],
|
|
|
+ data: [
|
|
|
+ [1320, 1302, 901, 634, 1390, 1330, 1320, 1000, 500],
|
|
|
+ [320, 302, 301, 334, 390, 330, 320, 100, 50],
|
|
|
+ [320, 302, 301, 334, 390, 330, 320, 100, 50],
|
|
|
+ [1320, 1302, 901, 634, 1390, 1330, 1320, 1000, 500],
|
|
|
+ [320, 302, 301, 334, 390, 330, 320, 100, 50],
|
|
|
+ [320, 302, 301, 334, 390, 330, 320, 100, 50],
|
|
|
+ [1320, 1302, 901, 634, 1390, 1330, 1320, 1000, 500],
|
|
|
+ [320, 302, 301, 334, 390, 330, 320, 100, 50],
|
|
|
+ ],
|
|
|
+ };
|
|
|
+ },
|
|
|
+ },
|
|
|
+ lineData: {
|
|
|
+ type: Array,
|
|
|
+ // default: () => [200, 350, 400, 500, 600, 700, 800, 900, 1200],
|
|
|
+ },
|
|
|
+ // 单位
|
|
|
+ units: {
|
|
|
+ type: Array,
|
|
|
+ default: () => ["", "风机健康状态数量"],
|
|
|
+ },
|
|
|
+ // 显示 legend
|
|
|
+ showLegend: {
|
|
|
+ type: Boolean,
|
|
|
+ default: true,
|
|
|
+ },
|
|
|
+ // 颜色
|
|
|
+ color: {
|
|
|
+ type: Array,
|
|
|
+ default: () => ["#05bb4c", "#4b55ae", "#e17e23", "#02BB4C", "#EDB32F", "#EDEB2F"],
|
|
|
+ },
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ id: "",
|
|
|
+ chart: null,
|
|
|
+ newbardata:null
|
|
|
+ };
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ bardata: {
|
|
|
+ handler(newValue, oldValue) {
|
|
|
+ console.warn(newValue);
|
|
|
+ this.newbardata = newValue;
|
|
|
+ this.initChart();
|
|
|
+ },
|
|
|
+ deep: true,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ legend() {
|
|
|
+ return this.newbardata.legend;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ initChart() {
|
|
|
+ let chart = echarts.init(this.$el);
|
|
|
+ let option = {
|
|
|
+ color: this.color,
|
|
|
+ grid: {
|
|
|
+ left: 16,
|
|
|
+ right: 16,
|
|
|
+ bottom: 0,
|
|
|
+ top: 32,
|
|
|
+ containLabel: true,
|
|
|
+ },
|
|
|
+ tooltip: {
|
|
|
+ trigger: "axis",
|
|
|
+ backgroundColor: "rgba(0,0,0,0.4)",
|
|
|
+ borderColor: partten.getColor("gray"),
|
|
|
+ textStyle: {
|
|
|
+ color: "#fff",
|
|
|
+ fontSize: 14,
|
|
|
+ },
|
|
|
+ // formatter: function(param) {
|
|
|
+ // return param.name + "<br >" + param.marker + param.seriesName + ":" + param.value;
|
|
|
+ // },
|
|
|
+ },
|
|
|
+ legend: {
|
|
|
+ show: this.showLegend,
|
|
|
+ data: this.newbardata.legend,
|
|
|
+ right: 120,
|
|
|
+ icon: "ract",
|
|
|
+ itemWidth: 8,
|
|
|
+ itemHeight: 8,
|
|
|
+ inactiveColor: partten.getColor("gray"),
|
|
|
+ textStyle: {
|
|
|
+ color: partten.getColor("grayl"),
|
|
|
+ fontSize: 12,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xAxis: [
|
|
|
+ {
|
|
|
+ type: "category",
|
|
|
+ axisLabel: {
|
|
|
+ color: partten.getColor("gray"),
|
|
|
+ },
|
|
|
+ axisLine: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ data: this.newbardata.area,
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ yAxis: [
|
|
|
+ {
|
|
|
+ type: "value",
|
|
|
+ min: function(value){
|
|
|
+ return (value.min-1)%1==0?value.min-1:(value.min-1).toFixed(0);
|
|
|
+ },
|
|
|
+ max: function(value){
|
|
|
+ return value.max;
|
|
|
+ },
|
|
|
+ name: this.units[0],
|
|
|
+ axisLabel: {
|
|
|
+ formatter: "{value} ",
|
|
|
+ color: partten.getColor("gray"),
|
|
|
+ },
|
|
|
+ axisLine: {
|
|
|
+ type: "dashed",
|
|
|
+ lineStyle: {
|
|
|
+ color: partten.getColor("gray"),
|
|
|
+ },
|
|
|
+ width: 5,
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ splitLine: {
|
|
|
+ lineStyle: {
|
|
|
+ type: "dashed",
|
|
|
+ dashOffset: 10,
|
|
|
+ color: partten.getColor("gray") + 80,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "value",
|
|
|
+ name: this.units[1],
|
|
|
+ axisLabel: {
|
|
|
+ formatter: "{value} ",
|
|
|
+ color: partten.getColor("gray"),
|
|
|
+ align: "left",
|
|
|
+ },
|
|
|
+ axisLine: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ splitLine: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ series: [],
|
|
|
+ };
|
|
|
+
|
|
|
+ // line data
|
|
|
+ if (this.lineData.length > 0) {
|
|
|
+ option.series.push({
|
|
|
+ name: this.units[0],
|
|
|
+ type: "line",
|
|
|
+ data: this.lineData,
|
|
|
+ smooth: false, //平滑展示
|
|
|
+ yAxisIndex: 0,
|
|
|
+ lineStyle: {
|
|
|
+ // color: partten.getColor("green"),
|
|
|
+ color: "#1a93cf",
|
|
|
+ },
|
|
|
+ itemStyle: {
|
|
|
+ // color: partten.getColor("green"),
|
|
|
+ color: "#1a93cf",
|
|
|
+ },
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // bar data
|
|
|
+ for (var i = 0; i < this.newbardata.legend.length; i++) {
|
|
|
+ option.series.push({
|
|
|
+ name: this.newbardata.legend[i],
|
|
|
+ type: "bar",
|
|
|
+ stack: "总量",
|
|
|
+ yAxisIndex: 1,
|
|
|
+ barWidth: "10%",
|
|
|
+ label: {
|
|
|
+ show: false,
|
|
|
+ position: "insideRight",
|
|
|
+ },
|
|
|
+ data: this.newbardata.data[i],
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ chart.setOption(option);
|
|
|
+ },
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ this.id = "pie-chart-" + util.newGUID();
|
|
|
+ this.newbardata = this.bardata
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.$el.style.width = this.width;
|
|
|
+ this.$el.style.height = this.height;
|
|
|
+ this.initChart();
|
|
|
+ });
|
|
|
+ },
|
|
|
+ updated() {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.initChart();
|
|
|
+ });
|
|
|
+ },
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="less">
|
|
|
+.chart {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ display: inline-block;
|
|
|
+}
|
|
|
+</style>
|