后端加前端Echarts画图示例全流程(折线图,饼图,柱状图)

本文将带领读者通过一个完整的Echarts画图示例项目,演示如何结合后端技术(使用Spring Boot框架)和前端技术(使用Vue.js或React框架)来实现数据可视化。我们将实现折线图、饼图和柱状图三种常见的数据展示方式,通过具体的代码和步骤让读者掌握从零开始搭建项目到展示图表的全过程。

开发环境

后端

SpringBoot  2.6.13

Mybatis-Plus 3.4.3

前端

原生JavaScript

前期准备

数据库创建语句

CREATE TABLE sales_data (
    id INT AUTO_INCREMENT PRIMARY KEY,
    month VARCHAR(7) NOT NULL,
    amount DECIMAL(10, 2) NOT NULL
);

具体实现 

实体类

@Data
@TableName("sales_data")
public class SalesRecord {
    
    @TableId(type = IdType.AUTO)
    private Long id;
    
    private String month;
    
    private Double amount;
}

Mapper层

@Mapper
public interface SalesRecordMapper extends BaseMapper<SalesRecord> {
    // 自定义查询方法,根据月份范围查询销售记录
    @Select("SELECT * FROM sales_data WHERE month BETWEEN #{startMonth} AND #{endMonth}")
    List<SalesRecord> findByMonthBetween(@Param("startMonth") String startMonth, @Param("endMonth") String endMonth);
}

Service层

public interface SalesRecordService {
    List<SalesRecord> getAllSalesRecords();
    List<SalesRecord> getSalesRecordsByMonthRange(String startMonth, String endMonth);
}

Impl层

@Service
public class SalesRecordServiceImpl extends ServiceImpl<SalesRecordMapper, SalesRecord> implements SalesRecordService {

    @Resource
    private SalesRecordMapper salesRecordMapper;

    @Override
    public List<SalesRecord> getAllSalesRecords() {
        return list();
    }

    @Override
    public List<SalesRecord> getSalesRecordsByMonthRange(String startMonth, String endMonth) {
        // 实现根据月份范围查询的逻辑,使用 repository 或者自定义 SQL 查询数据库
        return salesRecordMapper.findByMonthBetween(startMonth, endMonth);
    }
}

Controller层

@RestController
@RequestMapping("/api/sales")
public class SalesRecordController {

    private final SalesRecordService salesRecordService;

    @Autowired
    public SalesRecordController(SalesRecordService salesRecordService) {
        this.salesRecordService = salesRecordService;
    }

    @GetMapping("/records")
    public List<SalesRecord> getAllSalesRecords() {
        return salesRecordService.getAllSalesRecords();
    }

    @GetMapping("/recordsByMonthRange")
    public List<SalesRecord> getSalesRecordsByMonthRange(
            @RequestParam("startMonth") String startMonth,
            @RequestParam("endMonth") String endMonth) {
        return salesRecordService.getSalesRecordsByMonthRange(startMonth, endMonth);
    }

}

前端页面

创建路径:src/main/resources/static/sales_bar_chart.html

柱形图(包含按照日期分页)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Sales Data Visualization</title>
  <!-- 引入 ECharts -->
  <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
  <!-- 引入 jQuery -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
<!-- 时间范围选择表单 -->
<label for="startMonth">开始月份:</label>
<input type="month" id="startMonth" name="startMonth">
<label for="endMonth">结束月份:</label>
<input type="month" id="endMonth" name="endMonth">
<button onclick="updateChart()">更新图表</button>

<!-- 图表展示 -->
<div id="chart" style="width: 800px; height: 600px;"></div>

<script>
  // 初始化页面时渲染默认图表
  renderDefaultChart();

  // 渲染默认图表
  function renderDefaultChart() {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://localhost:8099/api/sales/records');
    xhr.onload = function () {
      if (xhr.status === 200) {
        var salesData = JSON.parse(xhr.responseText);
        renderChart(salesData);
      } else {
        console.error('Failed to fetch sales data:', xhr.statusText);
      }
    };
    xhr.onerror = function () {
      console.error('Request failed.');
    };
    xhr.send();
  }

  // 更新图表函数,根据用户选择的时间范围发送请求
  function updateChart() {
    var startMonth = document.getElementById('startMonth').value;
    var endMonth = document.getElementById('endMonth').value;

    var xhr = new XMLHttpRequest();
    xhr.open('GET', `http://localhost:8099/api/sales/recordsByMonthRange?startMonth=${startMonth}&endMonth=${endMonth}`);
    xhr.onload = function () {
      if (xhr.status === 200) {
        var salesData = JSON.parse(xhr.responseText);
        renderChart(salesData);
      } else {
        console.error('Failed to fetch sales data:', xhr.statusText);
      }
    };
    xhr.onerror = function () {
      console.error('Request failed.');
    };
    xhr.send();
  }

  // 渲染 ECharts 图表
  function renderChart(data) {
    var chart = echarts.init(document.getElementById('chart'));

    var months = data.map(function (item) {
      return item.month;
    });
    var amounts = data.map(function (item) {
      return item.amount;
    });

    var option = {
      title: {
        text: 'Monthly Sales Amount'
      },
      tooltip: {},
      xAxis: {
        data: months
      },
      yAxis: {},
      series: [{
        name: 'Sales Amount',
        type: 'bar',
        data: amounts
      }]
    };

    chart.setOption(option);
  }
</script>
</body>
</html>

 

饼图

创建路径:src/main/resources/static/pie-chart-ajax.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Sales Data Pie Chart</title>
  <!-- 引入 ECharts -->
  <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
</head>
<body>
<!-- 定义一个具有一定尺寸的 div,用于渲染图表 -->
<div id="pieChart" style="width: 600px; height: 400px;"></div>

<script>
  // 使用 AJAX 请求后端数据
  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'http://localhost:8099/api/sales/records'); // 修改为实际的后端 API 路径
  xhr.onload = function () {
    if (xhr.status === 200) {
      var salesData = JSON.parse(xhr.responseText);
      renderPieChart(salesData);
    } else {
      console.error('Failed to fetch sales data:', xhr.statusText);
    }
  };
  xhr.onerror = function () {
    console.error('Request failed.');
  };
  xhr.send();

  // 渲染 ECharts 饼图
  function renderPieChart(data) {
    var pieChart = echarts.init(document.getElementById('pieChart'));

    // 构建饼图所需的数据格式
    var pieData = data.map(function(item) {
      return {
        name: item.month,
        value: item.amount
      };
    });

    // 配置饼图的选项
    var option = {
      title: {
        text: '销售数据分布'
      },
      tooltip: {
        trigger: 'item',
        formatter: '{a} <br/>{b} : {c} ({d}%)'
      },
      legend: {
        orient: 'vertical',
        left: 'left',
        data: data.map(function(item) { return item.month; }) // 设置图例数据
      },
      series: [
        {
          name: '销售数据',
          type: 'pie',
          radius: '55%',
          center: ['50%', '60%'],
          data: pieData // 使用从后端获取的数据
        }
      ]
    };

    // 使用配置项设置图表
    pieChart.setOption(option);
  }
</script>
</body>
</html>

折线图

创建路径:src/main/resources/static/sales_long_chart.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Sales Data Line Chart</title>
    <!-- 引入 ECharts -->
    <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
    <!-- 引入 jQuery -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
<!-- 定义一个具有一定尺寸的 div,用于渲染图表 -->
<div id="lineChart" style="width: 800px; height: 600px;"></div>

<script>
    // 使用 AJAX 请求后端数据
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://localhost:8099/api/sales/records'); // 修改为实际的后端 API 路径
    xhr.onload = function () {
        if (xhr.status === 200) {
            var salesData = JSON.parse(xhr.responseText);
            renderLineChart(salesData);
        } else {
            console.error('Failed to fetch sales data:', xhr.statusText);
        }
    };
    xhr.onerror = function () {
        console.error('Request failed.');
    };
    xhr.send();

    // 渲染 ECharts 折线图
    function renderLineChart(data) {
        var lineChart = echarts.init(document.getElementById('lineChart'));

        // 构建折线图所需的数据格式
        var xAxisData = data.map(function(item) {
            return item.month;
        });
        var seriesData = data.map(function(item) {
            return item.amount;
        });

        // 配置折线图的选项
        var option = {
            title: {
                text: '销售数据趋势'
            },
            tooltip: {
                trigger: 'axis',
                formatter: '{a} <br/>{b} : {c}'
            },
            xAxis: {
                type: 'category',
                data: xAxisData // 设置 X 轴数据
            },
            yAxis: {
                type: 'value'
            },
            series: [{
                name: '销售额',
                type: 'line',
                data: seriesData // 设置折线图数据
            }]
        };

        // 使用配置项设置图表
        lineChart.setOption(option);
    }
</script>
</body>
</html>

希望本文对你有所帮助。如果你有任何疑问或建议,欢迎在评论区留言讨论。Happy coding!

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MATLAB可以通过调用Excel COM对象来读取Excel数据,并使用MATLAB的绘图函数来绘制图形。 以下是一个简单的示例代码,用于读取Excel文件中的数据并绘制折线图: ```matlab % 读取Excel文件 excel = actxserver('Excel.Application'); workbook = excel.Workbooks.Open('data.xlsx'); sheet = workbook.Sheets.Item(1); range = sheet.UsedRange; data = range.Value; % 关闭Excel workbook.Close(false); excel.Quit(); % 提取数据并绘图 x = data(:,1); y = data(:,2); plot(x, y); xlabel('X'); ylabel('Y'); title('数据图'); ``` 在这个例子中,我们首先使用`actxserver`函数创建一个Excel COM对象,然后打开Excel文件并选择要读取的工作表。使用`UsedRange`属性可以获取工作表中使用的单元格范围,然后使用`Value`属性将数据读取到MATLAB中。 读取数据后,我们可以使用MATLAB的绘图函数(例如`plot`)来绘制图形。在这个例子中,我们使用第一列作为X轴数据,第二列作为Y轴数据,并添一些标签和标题。 最后,我们需要关闭Excel COM对象,以释放资源并避免内存泄漏。这可以通过调用`Close`和`Quit`方法来完成。 ### 回答2: MATLAB是一款广泛应用于科学计算和工程设计等领域的软件,它可以快速读取Excel文件并进行数据分析和图形绘制。在本文中,我们将介绍如何使用MATLAB读取Excel数据并绘图。 1. 读取Excel文件 MATLAB可以通过使用readtable函数轻松地读取Excel文件中的数据。readtable函数可以读取Excel文件中的所有数据或指定工作表中的数据。 创建Excel文件: ![excel文件示例1](https://img-blog.csdn.net/20180425173105957?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGltaXRfZmFjdHVyZXI=) 代码: ```matlab table = readtable('data.xlsx'); %读取整个excel xls文件 % table = readtable('data.xlsx', 'sheet', 'Sheet1'); %读取data.xlsx文件的sheet1数据 data = table2cell(table); % 将 table 类型 转换为 cell 类型 ``` 2. 数据处理 在MATLAB中,我们可以使用不同的数据处理方法,例如,减,乘和除等运算。可以使用MATLAB的内置函数对这些数据进行各种类型的统计分析。如果我们要画图,通常需要做的数据处理有数据清洗、数据转换和数据缩放等。 例如,如果我们想要绘制Excel中两个数字列的对比,那么就需要将这两列分别读取然后进行处理,生成新的比较数据列,再将新的列绘制在一个图表上。这些数据处理方法在MATLAB中也非常容易实现。 3. 绘制图表 MATLAB支持各种类型的图表绘制,例如散点图,直方图,折线图饼图和二维/三维图等。在本例中,我们将展示如何绘制两列数据的对比图。 代码如下: ```matlab % 读取Excel文件 table = readtable('data.xlsx'); data = table2cell(table); % 提取需要比较的两列 col1 = cell2mat(data(:,1)); col2 = cell2mat(data(:,2)); % 绘制散点图 scatter(col1,col2); % 添标题和标签 title('Comparison of two columns from Excel'); xlabel('X axis label'); ylabel('Y axis label'); % 设定X和Y坐标轴的范围 xlim([min(col1) max(col1)]); ylim([min(col2) max(col2)]); ``` 以上代码通过使用scatter函数生成散点图,为图表添了标题和标签,并设定了X和Y轴的范围。 通过这篇文章,我们介绍了如何使用MATLAB读取Excel数据并绘制图表。MATLAB可以轻松将Excel文件中的数据读取到MATLAB命令窗口,并使用MATLAB的各种数据处理和图表绘制工具可视化数据。如果您经常需要处理和绘制Excel文件中的数据,使用MATLAB非常方便。 ### 回答3: MATLAB是一种非常简单、快速的数值计算与数据可视化软件。它可以轻松读取Excel文件中的数据,并且可以将这些数据拟合成人们所需要的更具有生动性和可视化的图像。 读取Excel数据及转换 MATLAB软件自带内置函数load(),可以直接读取Excel文件中的数据。首先,需要打开Excel文件,然后选择“另存为”类型为“CSV(逗号分隔)(*.csv)”,在保存的过程中Excel表中的“逗号”被视为分隔符号被存储为CSV文件(即数据以逗号分隔的形式存储在文件中),进而可以读取和载。 代码示例: filename = 'data.csv'; %文件名为data.csv delimiter = ','; %指明分隔符为"," startRow = 2; %数据从excel表格的第2行开始 formatSpec = '%f%f%f%f%f%f%f%f%[^\n\r]'; %读取出每列数据格式 fileID = fopen(filename,'r'); %以只读方式打开data.csv dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter,'HeaderLines', startRow-1, 'ReturnOnError', false); fclose(fileID); %关闭文件 Data = [dataArray{1:end-1}]; %读取表格中数值型数据 textData = dataArray{end}; %读取表格中字符数据 clearvars filename delimiter startRow formatSpec fileID dataArray ans; 实现数据可视化 在读取数据之后,可以对数据做一些运算或者改变展现形式(如某些奇技淫巧),从而可以通过MATLAB进行更直观的图像展示。 代码示例: 1.绘制折线图 plot(Data(:,1),Data(:,5));%绘制第1列与第5列之间的折线 2.绘制散点图 scatter(Data(:,2),Data(:,5));%绘制第2列与第5列之间的散点图 3.绘制柱状图 bar(Data(:,3));%绘制第3列的柱状图 4.绘制饼状图 pie(Data(:,7));%绘制第7列的饼图 5.绘制3D图 mesh(Data(:,6),Data(:,4),Data(:,8)); %绘制第4、6和8列的三维坐标系 总结与展望 MATLAB读取Excel数据并绘图是一个相对简单但又十分实用的技能。在实际应用中,数据可视化有助于我们更好的了解数据,从中更快速和高效地获取我们所需要的信息,更精确地进行决策。 值得注意的是,MATLAB读取Excel并绘图也存在一些限制性,如对数据量大小、数据类型以及对于不符合默认条件的Excel文件格式等方面进行的处理等。因此,在实际使用过程中,需了解Excel数据的具体格式,并合理使用MATLAB函数进行分析与展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值