可视化
概述
数据可视化技术的基本思想,是将数据库中每一个数据项作为单个图元元素表示,大量的数据集构成数据图像,同时将数据的各个属性值以多维数据的形式表示,可以从不同的维度观察数据,从而对数据进行更深入的观察和分析。
数据可视化之所以会大受欢迎,其原因不仅在于能带给用户良好的的视觉效果,更因为它能够产生生产力,形成数据驱动闭环,主要包含以下几个阶段:
1 )技术人员运用技术手段将需求分析、基础数据整合、数据计算等操作结合到一起进行数据可视化
2 )实时监控数据的变化情况
3 )用户能够使用这些可视化图表,进行分析、对比等操作,定位业务问题
4)之后再结合业务变动提出新的需求
5 )技术人员将用户访问数据与新的业务需求结合,重新进行数据整合、分析、计算,循环往复下去。
代码
前端
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/echarts.min.js"></script>
<script type="text/javascript">
window.onload=function(){
myChart = echarts.init(document.getElementById('dev01'));
//
timeArr=[]
pvArr=[]
uvArr=[]
vvArr=[]
newipArr=[]
newcustArr=[]
//定时器
window.setInterval(function(){
$.get("http://localhost:8080/FluxBiServer/BiView",function(datax){
//移除数据
if(pvArr.length>=15){
timeArr.shift()
pvArr.shift()
uvArr.shift()
vvArr.shift()
newipArr.shift()
newcustArr.shift()
}
//
timeArr.push(eval(datax)[0])
pvArr.push(eval(datax)[1])
uvArr.push(eval(datax)[2])
vvArr.push(eval(datax)[3])
newipArr.push(eval(datax)[4])
newcustArr.push(eval(datax)[5])
// 指定图表的配置项和数据
var option = {
legend:{
data:['pv','uv','vv','newip','newcust']
},
xAxis: {
type: 'category',
data: timeArr
},
yAxis: {
type: 'value'
},
series: [
{
name:'pv',
data: pvArr,
type: 'line',
smooth: true
},
{
name:'uv',
data:uvArr,
type: 'line',
smooth: true
},
{
name:'vv',
data: vvArr,
type: 'line',
smooth: true
},{
name:'newip',
data: newipArr,
type: 'line',
smooth: true
},{
name:'newcust',
data: newcustArr,
type: 'line',
smooth: true
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
})
},2000)
}
</script>
<title>Insert title here</title>
</head>
<body>
<div id="dev01" style="width: 1800px;height: 800px";align="center";> </div>
</body>
</html>
业务层
package cn.tedu.dataview;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.tagext.TryCatchFinally;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import jdk.management.cmm.SystemResourcePressureMXBean;
/**
* Servlet implementation class BiView
*/
@WebServlet("/BiView")
public class BiView extends HttpServlet {
private static final long serialVersionUID = 1L;
//
private ComboPooledDataSource source=new ComboPooledDataSource();
//
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Long timeStamp=System.currentTimeMillis();
SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd");
SimpleDateFormat sdf1=new SimpleDateFormat("HH-mm-ss");
//解析当天的日期
String ttime=sdf.format(timeStamp);
String xtime=sdf1.format(timeStamp);
Connection conn = source.getConnection();
PreparedStatement ps = conn.prepareStatement("select * from tongji2 where reporttime=?");
ps.setString(1, ttime);
ResultSet rs=ps.executeQuery();
if(rs.next()){
//当天有数据,则封装
int pv=rs.getInt("pv");
int uv=rs.getInt("uv");
int vv=rs.getInt("vv");
int newip=rs.getInt("newip");
int newcust=rs.getInt("newcust");
String result="["+"'"+xtime+"',"+pv+","+uv+","+vv+","+newip+","+newcust+"]";
response.getWriter().write(result);
}else{
//没有数据,则各个指标都为0
String result="["+"'"+xtime+"',"+"0,0,0,0,0]";
response.getWriter().write(result);
}
rs.close();
ps.close();
conn.close();
// response.setHeader("Access-Control-Allow-Origin", "*");
// //前台发起ajax,组织数据返回
// //返回数据格式[pv,uv,vv,newip,newcust]
// String result="[";
// for (int i = 0; i < 4; i++) {
// int num=new Random().nextInt(100);
// result=result+num+",";
// }
// int num=new Random().nextInt(100);
// result=result+num+"]";
// response.getWriter().write(result);
}catch (Exception e) {
}finally {
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
c3p0
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://hadoop01:3306/weblog</property>
<property name="user">root</property>
<property name="password">root</property>
</default-config>
</c3p0-config>
架构
可视化展示
可视化小demo
<!DOCTYPE html>
<html>
<head>
<title>ECharts</title>
<!--引入echarts.js -->
<script src="echarts.js"></script>
</head>
<body>
<div id="main" style="width:600px;height:400px"></div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data: ['销量']
},
xAxis: {
data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
},
yAxis: {},
series: [
{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>
<body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>ECharts</title>
<!--引入echarts.js -->
<script src="echarts.js"></script>
</head>
<body>
<div id="main" style="width:600px;height:400px"></div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
option = {
legend:{
data:['成本','利润']
},
title: {
text:'折线图',
left:'20%'
},
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [
{
name:'成本',
data: [150, 230, 224, 218, 135, 147, 260],
type: 'line'
},{
name:'利润',
data: [100, 2030, 2324, 2018, 1035, 1347, 1260],
type: 'line'
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>
<body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>ECharts</title>
<!--引入echarts.js -->
<script src="echarts.js"></script>
<script type="text/javascript">
window.onload=function () {
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
option = {
title: {
<!--text: 'Stacked Area Chart'-->
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
backgroundColor: '#6a7985'
}
}
},
legend: {
data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine']
},
toolbox: {
feature: {
saveAsImage: {}
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'category',
boundaryGap: false,
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
}
],
yAxis: [
{
type: 'value'
}
],
series: [
{
name: 'Email',
type: 'line',
stack: 'Total',
areaStyle: {},
emphasis: {
focus: 'series'
},
data: [120, 132, 101, 134, 90, 230, 210]
},
{
name: 'Union Ads',
type: 'line',
stack: 'Total',
areaStyle: {},
emphasis: {
focus: 'series'
},
data: [220, 182, 191, 234, 290, 330, 310]
},
{
name: 'Video Ads',
type: 'line',
stack: 'Total',
areaStyle: {},
emphasis: {
focus: 'series'
},
data: [150, 232, 201, 154, 190, 330, 410]
},
{
name: 'Direct',
type: 'line',
stack: 'Total',
areaStyle: {},
emphasis: {
focus: 'series'
},
data: [320, 332, 301, 334, 390, 330, 320]
},
{
name: 'Search Engine',
type: 'line',
stack: 'Total',
label: {
show: true,
position: 'top'
},
areaStyle:{ color:[ 'rgba (244,12,51,0.3) ' ] },
<!--areaStyle:{ },-->
emphasis: {
focus: 'series'
},
data: [820, 932, 901, 934, 1290, 1330, 1320]
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
}
</script>
</head>
<body>
<div id="main" style="width:600px;height:400px"></div>
<body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>ECharts</title>
<!--引入echarts.js -->
<script src="echarts.js"></script>
<script type="text/javascript">
window.onload=function () {
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
option = {
//color:['#FF0000','#9900CC','#9999CC' ,'#669933', '#000FF00','#FFF23F','#660033'],
title: {
text: 'Referer of a Website',
subtext: 'Fake Data',
left: 'center'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'left'
},
series: [
{
name: 'Access From',
type: 'pie',
radius: '50%',
data: [
{ value: 1048, name: 'Search Engine' },
{ value: 735, name: 'Direct' },
{ value: 580, name: 'Email' },
{ value: 484, name: 'Union Ads' },
{ value: 300, name: 'Video Ads' }
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
}
</script>
</head>
<body>
<div id="main" style="width:600px;height:400px"></div>
<body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>ECharts</title>
<!--引入echarts.js -->
<script type="text/javascript" src="echarts.min.js"></script>
<script type="text/javascript">
window.onload=function () {
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
option = {
dataset: {
source: [
['score', 'amount', 'product'],
[89.3, 58212, 'Matcha Latte'],
[57.1, 78254, 'Milk Tea'],
[74.4, 41032, 'Cheese Cocoa'],
[50.1, 12755, 'Cheese Brownie'],
[89.7, 20145, 'Matcha Cocoa'],
[68.1, 79146, 'Tea'],
[19.6, 91852, 'Orange Juice'],
[10.6, 101852, 'Lemon Juice'],
[32.7, 20112, 'Walnut Brownie']
]
},
grid: {containLabel: true},
xAxis: {name: 'amount'},
yAxis: {type: 'category'},
visualMap: {
orient: 'horizontal',
left: 'right',
min: 0,
max: 350,
dimension: 0,
splitNumber:5,
inRange: {
color: ['#D7DA8B', '#E15457']
}
},
//visualMap: {
// orient: 'horizontal',
// left: 'center',
// min: 10,
// max: 100,
// text: ['High Score', 'Low Score'],
// // Map the score column to color
// dimension: 0,
// inRange: {
// color: ['#D7DA8B', '#E15457']
// }
//},
series: [
{
type: 'bar',
encode: {
// Map the "amount" column to X axis.
x: 'amount',
// Map the "product" column to Y axis
y: 'product'
}
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
}
</script>
</head>
<body>
<div id="main" style="width:600px;height:400px"></div>
<body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>ECharts</title>
<!--引入echarts.js -->
<script type="text/javascript" src="echarts.min.js"></script>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
window.onload=function(){
//定时器
window.setInterval(function() {
$.get("http://localhost:8080/FluxBiServer/Demo01",function(datax){
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
legend: {
data: ['成本']
},
xAxis: {
type:'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat','Sun']
},
yAxis: {
tpye:'value'
},
series: [
{
name: '成本',
type: 'bar',
data: eval(datax),
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
})
}, 2000);
}
</script>
</head>
<body>
<div id="main" style="width:600px;height:400px"></div>
<body>
</html>