echarts可视化图表

153 阅读1分钟

前言

人生没有对错,只有选择后的坚持,不后悔,走下去,就是对的。走着走着,花就开了, 终于完成这个需求。

首页 头部



  <div class="top-view">

    <el-row :gutter="20">

      <el-col :span="6">

        <el-card shadow="hover" class="card">

          <div class="common-card" v-if=".length">

            <div class="title">{{}}(元)</div>

            <div class="value">¥{{}}</div>

            <template>

              <div class="compare">

                <span>{{}}%</span>

                <div v-if="Number()>=0" class="increase"></div>

                <div v-else  class="decrease"></div>

              </div>

            </template>

\


          </div>

         

            <div

              id="today-money"

              :style="{ width: '50%', height: '55%', marginLeft: '50%' }"

            ></div>

        </el-card>

      </el-col>

      <el-col :span="6">

        <el-card shadow="hover" class="card1">

          <div class="common-card" v-if=".length">

            <div class="title" >{{ }}/{{}}</div>

            <div class="value">{{}}/{{}}</div>

            <template>

              <div class="compare">

                <span>{{}}% /{{}}%</span>

                <div v-if="Number()>=0" class="increase"></div>

                <div v-else  class="decrease"></div>

              </div>

            </template>

\


         

          </div>

            <div

              id=""

              :style="{ width: '50%', height: '55%', marginLeft: '50%' }"

            ></div>

        </el-card>

      </el-col>

      <el-col :span="6">

        <el-card shadow="hover" class="card2">

          <div class="common-card" v-if="topList.length">

            <div class="title">{{}}</div>

            <div class="value">{{}}</div>

            <template>

              <div class="compare">

                <span>{{}}%</span>

               <div v-if="Number()>=0" class="increase"></div>

                <div v-else  class="decrease"></div>

              </div>

            </template>

\


         

          </div>

            <div

              id=""

              :style="{ width: '50%', height: '55%', marginLeft: '50%' }"

            ></div>

        </el-card>

      </el-col>

      <el-col :span="6">

        <el-card shadow="hover" class="card3">

          <div class="common-card" v-if="length">

            <div class="title">{{}}(min)</div>

            <div class="value">{{}}</div>

            <template>

              <div class="compare">

                <span>{{}}%</span>

                <div v-if="Number()>=0" class="increase"></div>

                <div v-else  class="decrease"></div>

              </div>

            </template>
            </div>

           <div

            id=""

            :style="{ width: '50%', height: '55%', marginLeft: '50%' }"

            ></div>

        </el-card>

      </el-col>

    </el-row>

  </div>

</template>

<script>


export default {

  data() {

    return {

      List: [],

    };

  },

  mounted() {
this.getdate();
 },

  methods: {

    //数据交互

  async getdate() {
        获取当前时间的处理
      let current_datetime = new Date();

      let current_date =

        current_datetime.getFullYear() +

        "-" +

        (current_datetime.getMonth() + 1) +

        "-" +

        current_datetime.getDate();

      console.log(current_date, "时间");
     await axios

        .get("", {

          params: {

            date: current_date,

          },

        })

        .then((res) => {

          this.List = res.data.data;

          console.log(this.pList, "top");

\


      
};

</script>

<style lang='less' scoped>

.top-view {

  width: 100%;

  height: 100%;

}

.common-card {

  width: 100%;

  height: 100%;

}

.title {

  font-size: 23px;

  color: #999;

}

\


.value {

  font-size: 20px;

  color: #000;

  font-weight: 600;

  margin-top: 10px;

  letter-spacing: 1px;

}

\


.chart {

  width: 60%;

  display: inline-block;

  margin-left: 35%;

}

.per {

  font-size: 20px;

  color: #999;

  margin-top: 20px;

}

\


.compare {

  display: flex;

  align-items: center;

  font-size: 16px;

  margin-top: 3px;

  color: #666;
  //三角形
  .increase {

    width: 0;

    height: 0;

    border-width: 4px;

    border-color: transparent transparent red transparent;

    border-style: solid;

    margin: 0 0 3px 6px;

  }

  .decrease {

    width: 0;

    height: 0;

    border-width: 3px;

    border-color: green transparent transparent transparent;

    border-style: solid;

    margin: 4px 0 0 6px;

  }

}
 图形前一条竖线
.card {

  border-left: 8px solid #3395ec;

}

.card1 {

  border-left: 8px solid #5fab24;

}

.card2 {

  border-left: 8px solid #ef8931;

}

.card3 {

  border-left: 8px solid red;

}

.el-tabs__item {

  font-size: 24px !important;

  font-weight: 600 !important;

}

</style>

可视化图表一

 日月年 切换
<template>

  <div style="width: 100%; height: 100%">

    <el-card shadow="hover" :body-style="{ padding: '0 0 20px 0' }">

      <template v-slot:header>

        <div class="menu-right">

          <el-radio-group

            v-model="dateType"

            size="small"

            @change="changeDateFormat"

          >

            <el-radio-button label="01"></el-radio-button>
           <el-radio-button label="02"></el-radio-button>

            <el-radio-button label="03"></el-radio-button>

          </el-radio-group>

          <span style="margin: 0 20xp">统计时间:</span>
        <el-date-picker

            v-model="dateRange"

            :type="dateDict[Number(dateType) - 1].type"

            :value-format="dateDict[Number(dateType) - 1].format"

            :format="dateDict[Number(dateType) - 1].format"

            range-separator="至"

            start-placeholder="开始时间"

            end-placeholder="结束结束"

            unlink-panels

            @change="handleDateRange"

          >

          </el-date-picker>

        </div>

      </template>

      <template>

        <div>

          <div id="" style="width: 100%; height: 500px"></div>

        </div>

        <div>

          <div id="" style="width: 100%; height: 500px"></div>

        </div>

      </template>

    </el-card>

  </div>

</template>

<script>



export default {

  data() {

    return {

      dateType: "02",

      dateDict: [

        {

          type: "daterange",

          format: "yyyy-MM-dd",

        },

        {

          type: "monthrange",

          format: "yyyy-MM",

        },

        {

          type: "daterange",

          format: "yyyy",

        },

      ],

      radioSelect: "2",

      dateRange: null,

    };

  },

  mounted() {
    this.getmediumScalar();

    this.getsituation();

  },

  methods: {

    //   时间范围

    handleDateRange(e) {

      console.log(e);

      console.log(this.dateRange);

      this.getmediumScalar();

      this.getsituation();

    },

    //   切换年月日

    changeDateFormat(e) {

      console.log('切换年月日',e);

      this.getmediumScalar();

      this.getsituation();

    },



    getmediumScalar() {

      axios

        .get("", {

          params: {

            type: this.dateType,

            startDate: this.dateRange ? this.dateRange[0] : "",

            endDate: this.dateRange ? this.dateRange[1] : "",

          },

        })

        .then((res) => {

          let scalarList = res.data.data;

          let dateList = [];

          let valueList = [];

          scalarList.map((item) => {

            dateList.push(item.date);

            valueList.push(item.number);

          });

          this.rendermediumScalar(dateList, valueList);

        });

    },

\


    //  

    rendermediumScalar(dateList, valueList) {

      let base = +new Date();

      let oneDay = 24 * 3600 * 1000;

      let date = [];

      let data = [Math.random() * 300];

      for (let i = 1; i < 20000; i++) {

        var now = new Date((base += oneDay));

        date.push(

          [now.getFullYear(), now.getMonth() + 1, now.getDate()].join("/")

        );

        data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));

      }

      const chartDom1 = document.getElementById("");

      const vochart = echarts.init(chartDom1);

      vochart.setOption({

        title: {

          text: "",

        },

        xAxis: {

          type: "category",

\


          data: dateList,

        },

        dataZoom: [

          {

            type: "inside",

            start: 5,

            end: 10,

            preventDefaultMouseMove: true,

          },

          {

            start: 5,

            end: 10,

          },

        ],

        yAxis: {

          type: "value",

        },

        series: [

          {

            data: valueList,

            type: "bar",

          },

        ],

        grid: {

          left: "3%",

          right: "4%",

          bottom: "3%",

          containLabel: true,

        },

      });

      window.onresize = vochart.resize;

    },

\


    //

    getsituation() {

      axios

        .get("", {

          params: {

            type: this.dateType,

            startDate: this.dateRange ? this.dateRange[0] : "",

            endDate: this.dateRange ? this.dateRange[1] : "",

          },

        })

        .then((res) => {

          let situation=res.data.data

         

          let accountList=[]

          let claimAmountList=[]

          let caseNumsList=[]

          let timeLineList=[]

           situation.map((item)=>{

           accountList.push(item.accountNums)

           claimAmountList.push(item.claimAmount)

           caseNumsList.push(item.caseNums)

           timeLineList.push(item.timeLine)

          })

          this.vote(accountList,claimAmountList,caseNumsList,timeLineList)

         

          console.log(situation, "zic");

        });

    },

\


    vote(accountList,claimAmountList,caseNumsList,timeLineList) {

      let base = +new Date();

      let oneDay = 24 * 3600 * 1000;

      let date = [];

      let data = [Math.random() * 300];

      for (let i = 1; i < 20000; i++) {

        var now = new Date((base += oneDay));

        date.push(

          [now.getFullYear(), now.getMonth() + 1, now.getDate()].join("/")

        );

        data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));

      }

      const chartDom = document.getElementById("after-property");

      const votechart = echarts.init(chartDom);

      votechart.setOption({

        title: {

          text: "",

        },

        tooltip: {

          trigger: "axis",

        },

        legend: {

          data: ["户数", "笔数", "金额"],

        },

        series: [

          {

            name: "户数",

            type: "line",

            stack: "Total",

            data: accountList,

          },

          {

            name: "笔数",

            type: "line",

            stack: "Total",

            data: caseNumsList,

          },

          {

            name: "金额",

            type: "line",

            stack: "Total",

            data: claimAmountList,

          },

        ],

        xAxis: {

          type: "category",

          boundaryGap: false,

          data: timeLineList,

        },

        dataZoom: [

          {

            type: "inside",

            start: 5,

            end: 10,

            preventDefaultMouseMove: true,

          },

          {

            start: 5,

            end: 10,

          },

        ],

        yAxis: {

          type: "value",

        },

        grid: {

          left: "3%",

          right: "4%",

          bottom: "3%",

          containLabel: true,

        },

      });

    },

  },

};

</script>

\

可视化图二

<template>

  <div style="width: 100%; height: 100%">

    <el-card shadow="hover" :body-style="{ padding: '0 0 20px 0' }">

      <template v-slot:header>

        <div class="menu-right">

          <el-radio-group

            v-model="dateType"

            size="small"

            @change="changeDateFormat"

          >

            <el-radio-button label="01"></el-radio-button>

\


            <el-radio-button label="02"></el-radio-button>

            <el-radio-button label="03"></el-radio-button>

          </el-radio-group>

          <span style="margin: 0 20xp">统计时间:</span>

\


          <el-date-picker

            v-model="dateRange"

            :type="dateDict[Number(dateType) - 1].type"

            :value-format="dateDict[Number(dateType) - 1].format"

            :format="dateDict[Number(dateType) - 1].format"

            range-separator="至"

            start-placeholder="开始时间"

            end-placeholder="结束结束"

            unlink-panels

            @change="handleDateRange"

          >

         </el-date-picker>

        </div>

      </template>

      <template>

        <div>

          <div id="" style="width: 100%; height: 500px"></div>

        </div>

        <div>

          <div id="" style="width: 100%; height: 500px"></div>

        </div>

        <div>

          <div id="" style="width: 100%; height: 500px"></div>

        </div>

      </template>

    </el-card>

  </div>

</template>

<script>


export default {

  data() {

    return {

      dateType: "02",

      dateDict: [

        {

          type: "daterange",

          format: "yyyy-MM-dd",

        },

        {

          type: "monthrange",

          format: "yyyy-MM",

        },

        {

          type: "daterange",

          format: "yyyy",

        },

      ],

      radioSelect: "2",

      dateRange: null,

     

    };

  },

  mounted() {

    this.middlechart();

    this.getProportion();

    this.getTransferor();

  },

  methods: {

    //   时间范围

    handleDateRange(e) {

      console.log(e);

      console.log(this.dateRange);

      this.middlechart();

      this.getProportion();

      this.getTransferor();

    },

    //   切换年月日

    changeDateFormat(e) {

      console.log(e);

      this.middlechart();

      this.getProportion();

      this.getTransferor();

    },

\


   

    getTransferor() {

      axios

        .get("", {

          params: {

            type: this.dateType,

            startDate: this.dateRange ? this.dateRange[0] : "",

            endDate: this.dateRange ? this.dateRange[1] : "",

          },

        })

        .then((res) => {

          let tranList = res.data.data;

          let transferorlegend=[];

          let transferorList=[];
          //数据处理
          tranList.map((item) => {

            transferorlegend.push(item.transferorName);

             transferorList.push({

              value: item.assetNumber,

              name: item.transferorName,

            });

          });

            this.renderTransferor(transferorlegend,transferorList)

\


         

        });

    },

    //

        renderTransferor(transferorlegend,transferorList){

            let base = +new Date();

          let oneDay = 24 * 3600 * 1000;

          let date = [];

          let data = [Math.random() * 300];

          for (let i = 1; i < 20000; i++) {

            var now = new Date((base += oneDay));

            date.push(

              [now.getFullYear(), now.getMonth() + 1, now.getDate()].join("/")

            );

            data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));

          }

          const chartDom2 = document.getElementById("middle-pie1");

          const chart2 = echarts.init(chartDom2);

          chart2.setOption({

            title: {

              text: "",

            },

            tooltip: {

              trigger: "item",

              formatter: "{b}: {c} ({d}%)",

            },

            legend: {

              top: "5%",

              left: "center",

              data: transferorlegend,

            },

\


            series: [

              {

                type: "pie",

                label: {

                  formatter: "{b}: {c} ({d}%)",

                },

\


                data:transferorList,

                radius: "50%",

                emphasis: {

                  itemStyle: {

                    shadowBlur: 10,

                    shadowOffsetX: 0,

                    shadowColor: "rgba(0, 0, 0, 0.5)",

                  },

                },

              },

            ],

          });

          window.onresize = chart2.resize

        },

    //

    getProportion() {

      axios

        .get("", {

          params: {

            type: this.dateType,

            startDate: this.dateRange ? this.dateRange[0] : "",

            endDate: this.dateRange ? this.dateRange[1] : "",

          },

        })

        .then((res) => {

          let List = res.data.data;

       let resultList=[]

         List.map((item) => {

        resultList.push({ value: item.number, name: item.typeName });

          });

          console.log(resultList,'资产')

          this.renderProportion(resultList)

\


         

       

        });

    },

\


    //

     renderProportion(resultList){

          const chartDom1 = document.getElementById("");

          const michart1 = echarts.init(chartDom1);

          let base = +new Date();

          let oneDay = 24 * 3600 * 1000;

          let date = [];

          let data = [Math.random() * 300];

          for (let i = 1; i < 20000; i++) {

            var now = new Date((base += oneDay));

            date.push(

              [now.getFullYear(), now.getMonth() + 1, now.getDate()].join("/")

            );

            data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));

          }

\


          michart1.setOption({

            title: {

              text: "",

            },

            tooltip: {

              trigger: "item",

            },

            legend: {

              top: "5%",

              left: "center",

            },

      series: [

              {

                type: "pie",

                avoidLabelOverlap: false,

                label: {

                  show: false,

                  position: "center",

                },

                data:resultList,

                radius: ["40%", "70%"],

              },

            ],

          });

           window.onresize =  michart1.resize

     },



    renderPayment(dateList, numberList) {

      var chartDom = document.getElementById("");

      var myChart = echarts.init(chartDom);

      var option;

let base = +new Date(2021, 3, 30);

      let oneDay = 24 * 3600 * 1000;

      let date = [];

      let data = [Math.random() * 300];

      for (let i = 1; i < 20000; i++) {

        var now = new Date((base += oneDay));

        date.push(

          [now.getFullYear(), now.getMonth() + 1, now.getDate()].join("/")

        );

        data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));

      }

      option = {

        tooltip: {

          trigger: "axis",

          position: function (pt) {

            return [pt[0], "10%"];

          },

        },

        title: {

          left: "center",

          text: "",

        },

        toolbox: {

          feature: {

            dataZoom: {

              yAxisIndex: "none",

            },

            restore: {},

            saveAsImage: {},

          },

        },

        xAxis: {

          type: "category",

          boundaryGap: false,

          data: dateList,

        },

        yAxis: {

          type: "value",

          boundaryGap: [0, "100%"],

        },

        dataZoom: [

          {

            type: "inside",

            start: 0,

            end: 10,

          },

          {

            start: 0,

            end: 10,

          },

        ],

        series: [

          {

            name: "",

            type: "line",

            symbol: "none",

            sampling: "lttb",

            itemStyle: {

              color: "rgb(255, 70, 131)",

            },

            areaStyle: {

              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [

                {

                  offset: 0,

                  color: "rgb(255, 158, 68)",

                },

                {

                  offset: 1,

                  color: "rgb(255, 70, 131)",

                },

              ]),

            },

            data: numberList,

          },

        ],

      };

\


      option && myChart.setOption(option);

      window.onresize = myChart.resize


    },


    middlechart() {

      console.log(this.dateRange);

      axios

        .get("", {

          params: {

            type: this.dateType,

            startDate: this.dateRange ? this.dateRange[0] : "",

            endDate: this.dateRange ? this.dateRange[1] : "",

          },

        })

        .then((res) => {

          console.log(res, "3333");

          let result = res.data.data;

          let dateList = result.map((i) => i.date);

          let numberList = result.map((i) => i.number);

          console.log(dateList, "日期集合");

          this.renderPayment(dateList, numberList);

        });



    },

  },

};

</script>


可视化图表三 折线图饼图联动

<template>

  <div style="width: 100%; height: 100%">

    <el-card shadow="hover" :body-style="{ padding: '0 0 20px 0' }">

      <template v-slot:header>

        <div class="menu-right">

          <el-radio-group

            v-model="dateType"

            size="small"

            @change="changeDateFormat"

          >

            <el-radio-button label="01"></el-radio-button>

\


            <el-radio-button label="02"></el-radio-button>

            <el-radio-button label="03"></el-radio-button>

          </el-radio-group>

          <span style="margin: 0 20xp">统计时间:</span>

\


          <el-date-picker

            v-model="dateRange"

            :type="dateDict[Number(dateType) - 1].type"

            :value-format="dateDict[Number(dateType) - 1].format"

            :format="dateDict[Number(dateType) - 1].format"

            range-separator="至"

            start-placeholder="开始时间"

            end-placeholder="结束结束"

            unlink-panels

            @change="handleDateRange"

          >

          </el-date-picker>

        </div>

      </template>

 <template>

        <div>

          <div id="after-vote" style="width: 100%; height: 800px"></div>

        </div>

     

      </template>

    </el-card>

  </div>

</template>

<script>


export default {

  data() {

    return {

      dateType: "02",

      dateDict: [

        {

          type: "daterange",

          format: "yyyy-MM-dd",

        },

        {

          type: "monthrange",

          format: "yyyy-MM",

        },

        {

          type: "daterange",

          format: "yyyy",

        },

      ],

     

      date: null,

      paymentList: [],

    };

  },

  mounted() {

    this.getpayment();


  },

  methods: {

    //   时间范围

    handleDateRange(e) {

      console.log(e);

      console.log(this.dateRange);

       this.getpayment();

    },

    //   切换年月日

    changeDateFormat(e) {

      console.log("切换年月日", e);

       this.getpayment();

    },

\


    getpayment() {

      axios

        .get("", {

          params: {

            type: this.dateType,

            startDate: this.dateRange ? this.dateRange[0] : "",

            endDate: this.dateRange ? this.dateRange[1] : "",

          },

        })

        .then((res) => {

          if (res.data.code == "200") {

            console.log("touhou");

            console.log(res.data);

            this.paymentList = res.data.data;

            let payList = [];

            let paymentItem = [];

            let timeList = [];

            let timedata = ["organ"];

            let series=[]

            let pie=[{

              type: "pie",

              id: "pie",

              radius: "30%",

              center: ["50%", "35%"],

              emphasis: {

                focus: "self",

              },

              label: {

                formatter: "{b}: {@2021} ({d}%)",

              },

              encode: {

                itemName: "organ",

                value: "2021",

                tooltip: "2021",

              },

            }]

            let seriesList=[]

             //数据处理

            for (let i = 0; i <this.paymentList[0].companys.length ; i++) {

              let paymentItem1 = [];

              for (let f = 0; f < this.paymentList.length; f++) {

                paymentItem[i] = this.paymentList[f].companys[i].companyName;

                paymentItem1.push(this.paymentList[f].companys[i].repayment);

              }

              payList.push(paymentItem1);

            }
            //把数据处理成这样的数组
           dataset: {
      source: [
        ['product', '2012', '2013', '2014', '2015', '2016', '2017'],
        ['Milk Tea', 56.5, 82.1, 88.7, 70.1, 53.4, 85.1],
        ['Matcha Latte', 51.1, 51.4, 55.1, 53.3, 73.8, 68.7],
        ['Cheese Cocoa', 40.1, 62.2, 69.5, 36.4, 45.2, 32.5],
        ['Walnut Brownie', 25.2, 37.1, 41.2, 18, 33.9, 49.1]
      ]
    },
            payList.forEach((item, index) => {

              item.unshift(paymentItem[index]);

            });

            console.log(payList);

            //时间数据的提取

            this.paymentList.forEach((item) => {

              timeList.push(item.timeLine);

            });
          ['product', '2012', '2013', '2014', '2015', '2016', '2017'],
            console.log(timeList, "时间");

\


            let timedataList = timedata.concat(timeList);

\


            console.log("timedataList", timedataList);

            console.log("payList", payList);

            //处理 series 数据

             payList.map(()=>{

               series.push( {

              type: "line",

              smooth: true,

              seriesLayoutBy: "row",

              emphasis: { focus: "series" },

            })

             })
             动态折线图的数据处理
             seriesList=series.concat(pie)

             console.log(seriesList)

             console.log(series)

            this.renderAfterVote(timedataList, payList,seriesList);

          }

\


          console.log(res, "结构数据"); //合并数组

        });

    },

\


    renderAfterVote(timedataList, payList,seriesList) {

      //日期处理

      let base = +new Date();

      let oneDay = 24 * 3600 * 1000;

      let date = [];

      let data = [Math.random() * 300];

      for (let i = 1; i < 20000; i++) {

        var now = new Date((base += oneDay));

        date.push(

          [now.getFullYear(), now.getMonth() + 1, now.getDate()].join("/")

        );

        data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));

      }

\


      //echarts 图片

      var chartDom = document.getElementById("");

      var myChart = echarts.init(chartDom);

      var option;

 

      setTimeout(function () {

        let source = [timedataList, ...payList];

        console.log("crtdATA", source);

        option = {

          title: {

            text: "",

            textStyle: {

              color: "#F18E31",

              fontStyle: "normal",

            },

          },

          legend: {

            x: "center",

            y: "top",

            padding: 40,

          },

          tooltip: {

            trigger: "axis",

            showContent: true,

          },

          dataset: {

            source: source,

          },

          xAxis: { type: "category" },

            dataZoom: [

          {

            type: "inside",

            start: 5,

            end: 10,

            preventDefaultMouseMove: true,

          },

          {

            start: 5,

            end: 10,

          },

            ],  

          yAxis: { gridIndex: 0 },

          grid: { top: "55%" },

          series:seriesList

        };

        myChart.on("updateAxisPointer", function (event) {

          const xAxisInfo = event.axesInfo[0];

          if (xAxisInfo) {

            const dimension = xAxisInfo.value + 1;

            myChart.setOption({

              series: {

                id: "pie",

                label: {

                  formatter: "{b}: {@[" + dimension + "]} ({d}%)",

                },

                encode: {

                  value: dimension,

                  tooltip: dimension,

                },

              },

            });

          }

        });

        myChart.setOption(option);

      });




      option && myChart.setOption(option);

    },

  
  },

};

</script>

<style scoped>

</style>

总结

通过几天的努力,终于完成了这个需求任务,可以好好放松一下,继续坚持学习,不断进步。