ECharts绘制的图形保存为图片

最近的项目需要导出文件,导出的文件里有数据分析图,如折线图,柱状图,散点图等。综合考虑之后,我选择了目前已经很成熟的也很流行的ECharts库。

ECharts一个纯 Javascript 的图表库,它提供了绘制各种图形的方法方法,几乎囊括了所有的二维图形,用起来也很是方便。还提供了图片下载的功能。这里我们主要说的是图片下载。下面是我找到的一些方法总结以及它们的适用情况。

1.用ECharts配置项手册中的toolbox.feature.saveAsImage

因为是自带的,不需要怎么处理,直接用就好。示例:

toolbox: {

  show: true,

  feature: {

    saveAsImage: {

    show:true,

    excludeComponents :['toolbox'],

    pixelRatio: 2

    }

  }

}

这一段一定要写在option中,这样会在图形右上角产生一个保存为图片的标识,点击即可下载图片,这种方法试用于网站点击保存的需求,效果如下图:



saveAsImage测试效果图


2.用ECharts实例方法getImage

需要注意的是,这个功能在ECharts3中好像已经舍弃,作者用ECharts3没有出现任何效果,换成ECharts2的js文件才可以运行。示例:

myChart.setOption(option);

var picInfo = myChart.getImage();

getImage要放在setOption方法生成一个简单的图形之后,我们怎么验证getImage是否生效了呢?

方法a:万能的alert调试,这里 alert (picInfo); 的结果弹出的是[object HTMLImageElement],我们仍然不知道这里的对象是什么。

方法b:页面中新定义一个容器,将得到的picInfo写入div,看看是什么结果:

var picInfo = myChart.getImage();

οnlοad=function f(){

  document.getElementById("pic").appendChild(picInfo);

  //document.getElementById("pic").innerHTML = picInfo;

}

注意,这里的写入div,要用上面的方法写入上面定义的div。得到如下图所示:



getImage得到的对象写入div

如果用下面的方法写入,会在定义的div中出现[object HTMLImageElement],如下图:



getImage得到的对象普通写入

遗憾的是,这种方法得到的picInfo为[object HTMLImageElement],无法通过Ajax传递到后台处理,只能用于显示。因此,这种方法适用于一些网站绘制图形上下或者左右同步显示的需求。


3.用ECharts实例方法getDataURL

很显然,上面的两种情况并不能满足我现在图片自动保存的需求,下面说我最后解决方案。

首先,我们用getDataURL得到图片信息:

myChart.setOption(option);

var picInfo = myChart.getDataURL();

getDataURL仍然要放在setOption方法生成一个简单的图形之后,现在我们得到的picInfo是一串base64信息,我们设法将得到的picInfo用Ajax传递到后台处理,

如果你在测试的时候用了getDataURL方法,看到一个空的坐标轴,那么可能是动画效果产生的后果,animation决定是否开启动画,关闭即可,在option中加入:

animation : false,

好啦,得到的图形可以正确显示啦。祝大家好运,不要遇到各种棘手的问题。



  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,在Django中创建model,需要定义数据表的列和数据类型。例如,我们创建一个名为`Sales`的model,其中包含两个字段:`date`和`sales`。 ```python from django.db import models class Sales(models.Model): date = models.DateField() sales = models.IntegerField() ``` 然后,在views.py中获取数据库中的数据,将其转换为前端需要的数据格式。例如,我们可以使用Django的ORM获取数据库中所有的销售记录,并将其转换为一个列表,其中每个元素包含日期和销售额。 ```python from django.shortcuts import render from .models import Sales def sales_chart(request): sales_data = Sales.objects.all().values_list('date', 'sales') chart_data = [] for date, sales in sales_data: chart_data.append({'date': date.strftime('%Y-%m-%d'), 'sales': sales}) return render(request, 'sales_chart.html', {'chart_data': chart_data}) ``` 最后,在前端页面中使用Echarts绘制图形。我们可以使用JavaScript编写一个函数,将从views.py传递的数据渲染为图表。例如,以下代码将在页面中绘制一个折线图,其中x轴是日期,y轴是销售额。 ```html <!DOCTYPE html> <html> <head> <title>Sales Chart</title> <script src="https://cdn.jsdelivr.net/npm/echarts@4.9.0/dist/echarts.min.js"></script> </head> <body> <div id="sales-chart" style="width: 800px; height: 600px;"></div> <script> var chartData = JSON.parse('{{ chart_data|escapejs }}'); var chart = echarts.init(document.getElementById('sales-chart')); var option = { xAxis: { type: 'category', data: chartData.map(function(item) { return item.date; }) }, yAxis: { type: 'value' }, series: [{ data: chartData.map(function(item) { return item.sales; }), type: 'line' }] }; chart.setOption(option); </script> </body> </html> ``` 这样,我们就可以在Django中读取数据库信息,并在前端使用Echarts绘制图形了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值