javaScript蓝桥杯-----粒粒皆辛苦


一、介绍

俗话说“民以食为天”,粮食的收成直接影响着民生问题,通过对农作物产量的统计数据也能分析出诸多实际问题。

接下来就让我们使用 ECharts 图表,完成 X 市近五年来的农作物产量的统计图吧~

二、准备

本题已经内置了初始代码,打开实验环境,目录结构如下:

├── data.json
├── index.html
└── js
    ├── axios.min.js
    └── echarts.min.js

其中:

  • index.html 是主页面。
  • js/echarts.min.js 是 ECharts 文件。
  • js/axios.min.js 是 axios 文件。
  • data.json 是对应年份的粮食产量数据,单位为万吨。

选中 index.html 右键启动 Web Server 服务(Open with Live Server),让项目运行起来。

接着,打开环境右侧的【Web 服务】,就可以在浏览器中看到如下效果:
在这里插入图片描述

三、目标

请完成 index.html 文件中的 TODO 部分。

  1. 完成数据请求(数据来源 ./data.json)。
  2. data.json 中的数据中英文对照如下:
    在这里插入图片描述
  3. 在页面的折线图和饼形图中正确显示粮食产量数据。其中折线图为五年数据,饼图只显示 2022 年数据。

完成后,最终页面效果如下:
在这里插入图片描述

四、代码

data.json

{
    
    
  "code": 200,
  "desc": "请求成功",
  "data": {
    
    
    "2017": {
    
     "wheat": 431, "soybean": 142, "potato": 232, "corn": 642 },
    "2018": {
    
     "wheat": 417, "soybean": 156, "potato": 258, "corn": 643 },
    "2019": {
    
     "wheat": 416, "soybean": 168, "potato": 269, "corn": 650 },
    "2020": {
    
     "wheat": 436, "soybean": 174, "potato": 277, "corn": 680 },
    "2021": {
    
     "wheat": 441, "soybean": 186, "potato": 289, "corn": 692 },
    "2022": {
    
     "wheat": 445, "soybean": 201, "potato": 315, "corn": 706 }
  }
}

index.html

<!DOCTYPE html>
<html style="height: 100%">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title>粒粒皆辛苦</title>
    <script type="text/javascript" src="./js/echarts.min.js"></script>
    <script src="./js/axios.min.js"></script>
  </head>

  <body style="height: 100%; margin: 0; overflow: hidden">
    <div id="container" style="height: 80%; width: 80%; margin: 5% auto"></div>
    <script>
      var dom = document.getElementById("container");
      var option;
      var myChart = echarts.init(dom, null, {
      
      
        renderer: "canvas",
        useDirtyRect: false,
      });
      let initCharts = () => {
      
      
        option = {
      
      
          title: {
      
      
            text: "近五年 x 市粮食总产量分布以及 2022 年粮食产量比例",
            subtext: "单位(万吨)",
          },
          dataset: {
      
      
            //source -> 图表显示所需的数据格式(饼形图和折线图共用),请勿手动修改此行
            source: [
              ["全部", "2017", "2018", "2019", "2020", "2021", "2022"],
              ["小麦", 1, 1, 1, 1, 1, 1],
              ["大豆", 9, 9, 9, 9, 9, 9],
              ["马铃薯", 13, 13, 13, 13, 13, 13],
              ["玉米", 23, 23, 23, 23, 23, 23],
            ],
          },
          xAxis: {
      
       type: "category" },
          yAxis: {
      
       gridIndex: 0 },
          grid: {
      
       top: "55%" },
          series: [
            {
      
      
              type: "line",
              seriesLayoutBy: "row",
            },
            {
      
      
              type: "line",
              seriesLayoutBy: "row",
            },
            {
      
      
              type: "line",
              seriesLayoutBy: "row",
            },
            {
      
      
              type: "line",
              seriesLayoutBy: "row",
            },
            {
      
      
              type: "pie",
              id: "pie",
              radius: "30%",
              center: ["50%", "25%"],
              label: {
      
      
                // 2022 数据的百分比
                formatter: "{b} {@2022} ({d}%)",
              },
              encode: {
      
      
                itemName: "全部",
                value: "2022",
                tooltip: "2022",
              },
            },
          ],
        };
        if (option && typeof option === "object") {
      
      
          // myChart.setOption -> 设置 echarts 数据的方法
          myChart.setOption(option);
        }
        window.addEventListener("resize", myChart.resize);
      };
      initCharts();

      // TODO: 待补充代码
    </script>
  </body>
</html>

五、完成

      // TODO: 待补充代码
      //获取数据
      async function getData() {
    
    
        const res = await axios({
    
     url: "./data.json" });
        return res.data.data;
      }
      //获取数据后重新渲染
      async function reDraw() {
    
    
        const res = await getData();
        // 我们需要的数据格式
        // ["全部", "2017", "2018", "2019", "2020", "2021", "2022"],
        //       ["小麦", 1, 1, 1, 1, 1, 1],
        //       ["大豆", 9, 9, 9, 9, 9, 9],
        //       ["马铃薯", 13, 13, 13, 13, 13, 13],
        //       ["玉米", 23, 23, 23, 23, 23, 23],
        const newObj = {
    
    
          全部: ["全部"],
          wheat: ["小麦"],
          soybean: ["大豆"],
          potato: ["马铃薯"],
          corn: ["玉米"],
        };
        //数据整合
        for (item in res) {
    
    
          newObj["全部"].push(item);
          for (item2 in res[item]) {
    
    
            newObj[item2].push(res[item][item2]);
          }
        }
        // 转化数据格式
        let newArr = [];
        for (item in newObj) {
    
    
          newArr.push(newObj[item]);
        }
        //重新渲染
        this.option.dataset.source = newArr;
        this.myChart.setOption(this.option);
      }
      reDraw();

猜你喜欢

转载自blog.csdn.net/m0_58065010/article/details/131034124