【echarts】数据可视化之桑葚图

最近由于一个特殊的需求,需要利用js读取本地json,然后再通过Echarts可视化出来。之前没有做过js读写本地文件的实验,幸亏看到一位大佬已经有做过这方面的工作,详情请移步这里:使用HTML5来实现本地文件读取和写入

1. 文件读取

在HTML5中可以利用FileReader实现文件读取,html代码如下:

<div>
    <input type="file" id="files" style="display:none" οnchange="import();"/>
    <input type="button" id="import" value="导入"/>
</div>

首先需要一个file类型的input元素,这里为啥要display:none呢?

因为这个东西太丑了,所以将其隐藏,通过定义一个button间接调用该元素,真的是大佬,这样的想法都能想到。JS代码如下:

//点击导入按钮,使files触发点击事件,然后完成读取文件的操作。
$("#import").click(function(){
    $("#files").click();
});

function import(){
	//获取文件浏览器选择的文件对象
    var selectedFile = document.getElementById("files").files[0];
    var name = selectedFile.name;//读取选中文件的文件名
    var size = selectedFile.size;//读取选中文件的大小
    console.log("文件名:"+name+"大小:"+size);
    
    //FileReader可以被Chrome、FF和Safari支持
	var reader = new FileReader();
	reader.readAsText(selectedFile);//读取文件的内容

	//当读取完成之后会回调这个函数,然后此时文件的内容存储到了result中。直接操作即可。
	reader.onload = function(){
    	console.log(this.result);
	};
}

这样,读取本地文件的操作就完成了。虽然ActiveXObject也可以,但是,目前只在IE中才能使用,所以为了兼容其他浏览器,还是不要这样使用了。

2. 写入文件

在HTML5中,与FileReader相对应的也有一个FileWriter。但是,没有找到一个可以用的FileWriter的API,而且似乎只有被Chrome支持。

//首先导入一个Js文件
<script type="text/javascript" src="./JS/FileSaver.js" charset="utf-8"></script>

//HTML中添加一个导出元素
<input type="button" id="export" value="导出"/>

//JS文件
$("#export).click(function(){
    var content = "这是直接使用HTML5进行导出的";
    var blob = new Blob([content], {type: "text/plain;charset=utf-8"});
    saveAs(blob, "file.txt");//saveAs(blob,filename)
});

3. js读取本地json文件并可视化

真心向大家推荐echarts,真的很漂亮,不信可以移步至:echarts官网实例

对于非专业的变成人员,也提供了类似于excel的数据可视化接口,并且看着比excel更加美观,这一功能隐藏在ECharts数据可视化实验室中,请点击:传送门

接着,点击开始制作即可通过鼠标点击的方式创建图表了。

这里,笔者采用的是echarts进行数据的可视化的,下面演示的是绘制桑葚图的过程。比较简单,只是为了出图,所以直接写的静态网页,然后数据定义在一个单独的json文件,动态地加载该文件。

<!DOCTYPE html>
<html style="height: 100%">
	<head>
		<meta charset="utf-8">
	</head>
	<body style="height: 100%; margin: 0">
		
		<input type="file" id="files" style="display:none"/>
		<button id="openFile" onclick="openJsonFile()">打开Json文件</button>
		<div id="container" style="height: 100%"></div>
			
		<script type="text/javascript" src="jquery-1.9.1.min.js"></script>
		<script type="text/javascript" src="echarts.min.js"></script>
			
		<script type="text/javascript">
			
			function openJsonFile(){
				$('#files').click();
				
				//读取本地的json数据
				var inputElement = document.getElementById("files");
				inputElement.addEventListener("change", handleFiles, false);
				function handleFiles() {
					var selectedFile = document.getElementById("files").files[0];//获取读取的File对象
					var name = selectedFile.name;//读取选中文件的文件名
					var size = selectedFile.size;//读取选中文件的大小
					console.log("文件名:"+name+"大小:"+size);
					var reader = new FileReader();//这里是核心!!!读取操作就是由它完成的。
					reader.readAsText(selectedFile);//读取文件的内容

					reader.onload = function(){
						console.log("读取结果:", this.result);//当读取完成之后会回调这个函数,然后此时文件的内容存储到了result中。直接操作即可。
						console.log("解析JSON并可视化");
						let json = JSON.parse(this.result);
						helloEcharts(json);
					};
				}
			}
				
			//可视化桑葚图
			function helloEcharts(data){
				var dom = document.getElementById("container");
				var myChart = echarts.init(dom);
				var app = {};
				option = {
					title: {
						text: 'Sankey Diagram'
					},
					tooltip: {
						trigger: 'item',
						triggerOn: 'mousemove'
					},
					series: [
						{
							type: 'sankey',
							data: data.nodes,
							links: data.links,
							focusNodeAdjacency: 'allEdges',
							itemStyle: {
								normal: {
									borderWidth: 1,
									borderColor: '#aaa'
								}
							},
							lineStyle: {
								normal: {
									color: 'source',
									curveness: 0.5
								}
							}
						}
					]
				};
					
				myChart.setOption(option);
					
				if (option && typeof option === "object") {
					myChart.setOption(option, true);
				}
			}
		</script>
	</body>
</html>


4. CDN加速

我们知道,对于一个网站来说,网站的访问速度对于用户的访问体验来说是非常重要的。CDN全称为内容分发网络,其主要是加速静态资源,如网站上面上传的图片、媒体,以及引入的一些Js、css等文件。

CDN加速需要依靠各个网络节点,例如100台CDN服务器分布在全国范围,从上海访问,会从最近的节点返回资源。CDN服务器通过缓存或者主动抓取主服务器的内容来实现资源储备。

再向大家推荐一个免费的bootstrap等前端框架的CDN加速服务:BootCDN

BootCDN 是 Bootstrap 中文网支持并维护的前端开源项目免费 CDN 服务,致力于为 Bootstrap、jQuery、Angular、Vuejs 一样优秀的前端开源项目提供稳定、快速的免费 CDN 加速服务。其共收录了 3442 个前端开源项目,为各个网站提供一个稳定、快速、免费的前端开源项目 CDN 加速服务,如果您的项目里面要引入bootstrap,使用CDN加速的方式无疑会大大提高您的线上应用的访问速度。

搜索上一节用到的FileSaver.js,并复制

<script src="https://cdn.bootcss.com/FileSaver.js/2014-11-29/FileSaver.js"></script>


您可以通过以下 API 获取 BootCDN 所加速的所有前端开源库的文件列表

https://api.bootcdn.cn/names.json


您还可以通过以下 API 获取 BootCDN 所加速的所有前端开源库的基本信息

https://api.bootcdn.cn/libraries.json

该列表是一个 json 数组(Array),数组中的每一个条目含义分别为:

  • 开源库的名称(name)
  • 描述(description)
  • 星标数(stars)

    通过下列的API获取某个特定的名称的开源库的详细信息:
https://api.bootcdn.cn/libraries/[name].json


通过此接口获取到的是开源库的 JSON 对象(Object)格式的详细信息,包括所有版本以及文件列表。[name] 是开源库的名称,可从[开源库简要信息列表]或[开源库名称列表]中获取。其中,assets 属性是所有版本及对应文件的列表。

5. 图片导出

还记得我们的目标吗?对,笔者这里只是为了画图,当然最终是想要得到一个png或者什么格式的图片了。既然是html5绘图,那么直接右键保存可以吗,试一下,看到如下的效果:

要么就是非常不清晰,如下所示:

怎么清晰地导出图片呢?

笔者推荐使用echarts自带的工具栏,毕竟原生的支持的最好,实现起来也很简单,就是在option配置中加入如下的内容:

toolbox: {
    //工具栏是否显示
	show : true,
	feature : {
        mark : {show: true},
        //切换至数据视图,更改数据可以看到实时更新的图像
        dataView : {show: true, readOnly: false},
        //切换至折线图或柱状图
        magicType : {show: true, type: ['line', 'bar']},
        //重新载入原始数据
        restore : {show: true},
        //是否可以导出图片
        saveAsImage : {show: true}
	}
}


最终,保存到本地的效果如下所示:

发布了192 篇原创文章 · 获赞 318 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/zyxhangiian123456789/article/details/102645119