java+echart(折线图和柱状图显示)

本文详细介绍如何使用柱状图和折线图展示从数据库获取的数据,包括数据填充、图表配置及前后端交互过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中用到了折线图和柱状图来展示数据,直接上代码。

后台:

这是柱状图:

List<UserResponse> aa = this.getData();
this.userResponseList = aa;
Result<Object> result = new Result<>();
Map<String, Object> returnDataMap = new HashMap<>();//用来装返回的数据的map 
List<UserResponse> records = userResponseList;//这是从数据库查出来的数据
List<String> legend = new ArrayList<>();//用来装该柱状图的名字的
List<Long> echarts1 = new ArrayList<>();这是装柱状图的数据的是一个list数组
List<Long> echarts2 = new ArrayList<>();
List<Long> echarts3 = new ArrayList<>();

 

List<EchartsEntity> echarts = new ArrayList<>();//这是为了响应起前段的一个实体类。类的属性如下

String[] xAxis = null;//x轴就是时间轴,也是一个数组。
xAxis = new String[userResponseList.size()];//x轴的大小取决于数组的大小

//循环DB数据的大小
for (int i = 0; i < userResponseList.size(); i++) {
//给x轴写入数据
    xAxis[i] = records.get(i).getStatisticTime().toLocaleString();
//给每一个树状图填充数据
    echarts1.add(records.get(i).getOnLineUserCount());
    echarts3.add(records.get(i).getDayIncreaseUserCount());
    echarts2.add(records.get(i).getDayLoginCount());
}

 

 

EchartsEntity entity1 = new EchartsEntity(userResponseList.get(0).getOnLineUserCountName(), "bar", echarts1, "");
EchartsEntity entity2 = new EchartsEntity(userResponseList.get(0).getDayLoginCountName(), "bar", echarts2, "");
EchartsEntity entity3 = new EchartsEntity(userResponseList.get(0).getDayIncreaseUserCountName(), "bar", echarts3, "");

echarts.add(entity1);
echarts.add(entity2);
echarts.add(entity3);

//给组装图填充名字
legend.add(userResponseList.get(0).getOnLineUserCountName());
legend.add(userResponseList.get(0).getDayLoginCountName());
legend.add(userResponseList.get(0).getDayIncreaseUserCountName());

 

returnDataMap.put("xAxis", xAxis);
returnDataMap.put("series", echarts);
returnDataMap.put("legend", legend);

result.setResult(returnDataMap);
result.setMessage("查询成功");
return result;

 

以上就是柱状图的;

折线图大致差不多,就是折线的类型需要修改一下

List<UserResponse> aa = this.getData();
this.userResponseList = aa;
String[] xAxis = null;//x轴

List<UserResponse> records = userResponseList;
List<String> lineColor = new ArrayList<>();//放置折线图每条信息的颜色
List<Long> echarts1 = new ArrayList<>();//折线1
List<Long> echarts2 = new ArrayList<>();//折线2
List<Long> echarts3 = new ArrayList<>();//折线3
List<EchartsEntity> echarts = new ArrayList<>();
Result<Object> result = new Result<>();

xAxis = new String[userResponseList.size()];//x轴的长度
for (int i = 0; i < userResponseList.size(); i++) {//循环mysql结果
    xAxis[i] = records.get(i).getStatisticTime().toLocaleString();//我是以时间作为x轴
    echarts1.add(records.get(i).getOnLineUserCount());//折线1
    echarts2.add(records.get(i).getDayLoginCount());//折线2
    echarts3.add(records.get(i).getDayIncreaseUserCount());//折线3

}

EchartsEntity entity1 = new EchartsEntity(userResponseList.get(0).getOnLineUserCountName(), "line", echarts1, "总量");
EchartsEntity entity2 = new EchartsEntity(userResponseList.get(0).getDayLoginCountName().toString(), "line", echarts2, "总量");
EchartsEntity entity3 = new EchartsEntity(userResponseList.get(0).getDayIncreaseUserCountName(), "line", echarts3, "总量");
echarts.add(entity1);
echarts.add(entity2);
echarts.add(entity3);
lineColor.add(userResponseList.get(0).getOnLineUserCountName());
lineColor.add(userResponseList.get(0).getDayLoginCountName());
lineColor.add(userResponseList.get(0).getDayIncreaseUserCountName());
Map<String, Object> ret = new HashMap<>();
ret.put("xAxis", xAxis);//x轴信息
ret.put("series", echarts);//折线内容
ret.put("legend", lineColor);//折线颜色和折线颜色所代表的的信息

result.setResult(ret);

return result;

 

 

 

<think>我们使用SSM框架(Spring+SpringMVC+MyBatis)来构建Web应用,并整合ECharts实现动态图表。需求:从数据库读取不同时间点的产品购买数据,绘制折线图柱状图(双图表结合)。步骤:1.后端准备:在Controller中提供接口返回时间序列数据(时间点对应的购买数量)。2.前端页面:引入ECharts库,使用Ajax请求数据,然后初始化图表。参考引用[1][3][4]中提到的SSM框架整合ECharts的方法,我们按以下步骤实现:一、后端实现(SSM框架)1.数据表设计(示例):CREATETABLE`purchase_record`(`id`int(11)NOTNULLAUTO_INCREMENT,`purchase_time`varchar(7)NOTNULLCOMMENT'购买时间,格式如:2023-01',`product_count`int(11)NOTNULLCOMMENT'购买数量',PRIMARYKEY(`id`));2.创建实体类PurchaseRecord:publicclassPurchaseRecord{privateIntegerid;privateStringpurchaseTime;//对应年月,如"2023-01"privateIntegerproductCount;//getterandsetter}3.Mapper接口(PurchaseRecordMapper.java):publicinterfacePurchaseRecordMapper{List<PurchaseRecord>selectPurchaseRecords();}4.MapperXML(PurchaseRecordMapper.xml):<selectid="selectPurchaseRecords"resultType="PurchaseRecord">SELECTpurchase_timeaspurchaseTime,product_countasproductCountFROMpurchase_recordORDERBYpurchase_time</select>5.Service层(PurchaseRecordService.java):publicinterfacePurchaseRecordService{List<PurchaseRecord>getPurchaseRecords();}@ServicepublicclassPurchaseRecordServiceImplimplementsPurchaseRecordService{@AutowiredprivatePurchaseRecordMapperpurchaseRecordMapper;@OverridepublicList<PurchaseRecord>getPurchaseRecords(){returnpurchaseRecordMapper.selectPurchaseRecords();}}6.Controller层(PurchaseRecordController.java):@Controller@RequestMapping("/purchase")publicclassPurchaseRecordController{@AutowiredprivatePurchaseRecordServicepurchaseRecordService;@RequestMapping("/chart")publicStringchartPage(){return"purchase-chart";//返回视图,即前端页面}@RequestMapping(value="/data",method=RequestMethod.GET)@ResponseBodypublicList<PurchaseRecord>getChartData(){returnpurchaseRecordService.getPurchaseRecords();}}二、前端实现(JSP页面或HTML页面)1.创建purchase-chart.jsp页面(放在WEB-INF/views下,如果使用JSP视图解析器)2.在页面中引入ECharts(通过CDN)jQuery(用于Ajax请求)。代码示例:```jsp<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>购买产品统计图</title><scriptsrc="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js"></script><scriptsrc="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script></head><body><divid="main"style="width:800px;height:400px;"></div><scripttype="text/javascript">$(function(){//基于准备好的dom,初始化echarts实例varmyChart=echarts.init(document.getElementById('main'));//通过Ajax获取数据$.get('${pageContext.request.contextPath}/purchase/data',function(data){//提取时间数量vartimes=[];varcounts=[];for(vari=0;i<data.length;i++){times.push(data[i].purchaseTime);counts.push(data[i].productCount);}//指定图表的配置项数据varoption={title:{text:'时间序列购买产品统计'},tooltip:{trigger:'axis'},legend:{data:['购买数量','购买趋势']},xAxis:{type:'category',data:times},yAxis:{type:'value'},series:[{name:'购买数量',type:'bar',data:counts},{name:'购买趋势',type:'line',data:counts,smooth:true}]};//使用刚指定的配置项数据显示图表。myChart.setOption(option);});});</script></body></html>```三、注意事项1.确保数据库连接正确,且数据能正确查询。2.确保Controller的映射路径正确,前端Ajax请求的URL要与Controller中定义的一致。3.如果遇到跨域问题(前后端分离),需要在Controller的方法上添加@CrossOrigin注解(或配置全局跨域)。四、效果页面加载后,将显示一个包含柱状图折线图图表,横轴为时间,纵轴为购买数量。五、扩展如果数据需要实时更新,可以使用定时器定期请求数据并调用`myChart.setOption`更新图表。参考引用[1][3][4]中提到的SSM框架整合ECharts的方法,我们实现了从数据库读取数据并展示图表。§§相关问题§§1.如何在ECharts中实现图表的动态数据更新?2.在SSM框架中如何优化ECharts的数据传输效率?3.如何将ECharts图表导出为图片或PDF?</think>### 在 SSM 框架中使用 ECharts 实现时间序列购买产品图表 以下是基于 SSM 框架实现时间序列购买产品折线图柱状图的完整方案,结合引用内容中的最佳实践: #### 1. 后端实现(Controller 层) ```java @Controller @RequestMapping("/chart") public class ChartController { @Autowired private PurchaseService purchaseService; // 获取时间序列购买数据 @RequestMapping(value = "/purchaseData", method = RequestMethod.GET) @ResponseBody public Map<String, Object> getPurchaseData() { List<PurchaseRecord> records = purchaseService.getTimeSeriesData(); // 提取时间数量数据 List<String> times = new ArrayList<>(); List<Integer> counts = new ArrayList<>(); for (PurchaseRecord record : records) { times.add(record.getPurchaseTime()); // 格式如 "2023-01" counts.add(record.getProductCount()); } Map<String, Object> result = new HashMap<>(); result.put("times", times); result.put("counts", counts); return result; // 自动转为JSON格式[^4] } } ``` #### 2. 前端实现(JSP 页面) ```jsp <%@ page contentType="text/html;charset=UTF-8" %> <html> <head> <title>购买产品统计</title> <script src="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script> <script src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js"></script> </head> <body> <!-- 图表容器 --> <div id="chartContainer" style="width: 800px;height:500px;"></div> <script> // 初始化图表 var chartDom = document.getElementById('chartContainer'); var myChart = echarts.init(chartDom); // 通过AJAX获取数据[^1] $.get('${pageContext.request.contextPath}/chart/purchaseData', function(response) { const option = { title: { text: '产品购买时间序列分析', subtext: '数据实时更新' }, tooltip: { trigger: 'axis' }, legend: { data: ['购买数量', '购买趋势'] }, xAxis: { type: 'category', data: response.times, // 从后端获取的时间数据 axisLabel: { rotate: 45 // 时间标签旋转防止重叠 } }, yAxis: { type: 'value', name: '购买数量' }, series: [ { name: '购买数量', type: 'bar', // 柱状图 data: response.counts, itemStyle: { color: '#5470c6' } }, { name: '购买趋势', type: 'line', // 折线图 data: response.counts, smooth: true, lineStyle: { width: 3, color: '#91cc75' } } ], dataZoom: [{ type: 'slider', start: 0, end: 100 }] }; myChart.setOption(option); }); // 窗口大小变化时重绘图表 window.addEventListener('resize', function() { myChart.resize(); }); </script> </body> </html> ``` #### 3. 关键组件说明 1. **数据流程**: - 前端发起AJAX请求 → 调用Controller的`/purchaseData`接口 - 后端查询数据库 → 返回JSON格式的时间序列数据[^1][^4] - ECharts使用返回的数据渲染图表 2. **图表配置要点**: - **双图表组合**:同时使用`bar`(柱状图`line`(折线图类型 - **时间轴处理**:`xAxis`设置为`category`类型,支持时间字符串 - **数据缩放**:`dataZoom`组件支持时间范围筛选[^2] - **响应式设计**:监听窗口resize事件自适应容器大小 3. **性能优化**: - 使用ECharts的数据压缩模式(large模式)处理大数据集 - 后端添加缓存机制(如Redis)减少数据库查询 - 前端使用防抖技术控制resize事件频率 #### 4. 数据库查询优化(Service层示例) ```java @Service public class PurchaseServiceImpl implements PurchaseService { @Autowired private PurchaseMapper purchaseMapper; @Override @Cacheable(value = "purchaseCache", key = "'timeSeriesData'") public List<PurchaseRecord> getTimeSeriesData() { // 按月份分组统计购买数量 return purchaseMapper.selectMonthlyPurchaseSummary(); } } ``` #### 5. 效果展示 最终将生成包含以下特征的图表: - 柱状图显示每月具体购买量 - 折线图展示整体购买趋势 - 支持通过滑块缩放时间范围 - 鼠标悬停显示详细数据点信息 - 自适应不同屏幕尺寸 > **提示**:对于实时数据更新需求,可添加WebSocket实现数据推送,或使用定时轮询机制[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值