Javascript D3.js未正确更新socket.io中的数据
我试图用我传递的数据更新mi图表,数据来得很快,如果我只是做一个控制台日志,我看到数据来得很好,但是当我尝试渲染它时,一切都很慢,我的行只显示第一个状态,从不改变,而且非常慢,我必须重新启动Firefox。这是我的密码:Javascript D3.js未正确更新socket.io中的数据,javascript,html,d3.js,socket.io,real-time,Javascript,Html,D3.js,Socket.io,Real Time,我试图用我传递的数据更新mi图表,数据来得很快,如果我只是做一个控制台日志,我看到数据来得很好,但是当我尝试渲染它时,一切都很慢,我的行只显示第一个状态,从不改变,而且非常慢,我必须重新启动Firefox。这是我的密码: <html> <head> <title>Dinamic Denia</title> <svg id="visualisation" width="1000" height="500"></sv
<html>
<head>
<title>Dinamic Denia</title>
<svg id="visualisation" width="1000" height="500"></svg>
<body>
<div id="tooltip" class="hidden" style="left: 429px, top: 489.6px">
<p><strong><span id="city">Dar es Salaam</span></strong></p>
</div>
</body>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<script src="http://d3js.org/d3.v3.min.js"></script>
<!--Load the AJAX API-->
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript" src="http://localhost:3000/socket.io/socket.io.js"></script>
<style>
.axis path, .axis line
{
fill: none;
stroke: #777;
shape-rendering: crispEdges;
}
.axis text
{
font-family: 'Arial';
font-size: 13px;
}
.tick
{
stroke-dasharray: 1, 2;
}
.bar
{
fill: FireBrick;
}
#tooltip {
position: absolute;
width: 230px;
height: auto;
padding: 10px;
background-color: white;
/*-webkit*/-border-radius: 10px;
/*-moz*/-border-radius: 10px;
border-radius: 10px;
/*-webkit*/-box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4);
/*-moz-*/box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4);
box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4);
pointer-events: none;
}
#tooltip.hidden {
display: none;
}
#tooltip p {
margin: 0;
font-family: sans-serif;
font-size: 16px;
line-height: 20px;
}
</style>
<script type="text/javascript">
var socket = io.connect('http://localhost:3000/');
socket.on('connect', function(data){
setStatus('connected');
socket.emit('subscribe', {channel:'realtime'});
});
socket.on('reconnecting', function(data){
setStatus('reconnecting');
});
socket.on('message', function (data) {
socket.emit('update', {channel:'realtime'});
InitChart(data);
console.log('dades: ', data);
console.log('received a message: ', data);
addMessage(data);
});
function addMessage(data) {
$('#online').html(data);
}
function setStatus(msg) {
console.log('Connection Status : ' + msg);
}
function InitChart(data) {
var array = data.split(',');
seeData(array);
// d3.tsv("dataDL.tsv", function(data) {
//d3.tsv("data2.tsv", function(data) {
//seeData(data);
// d3.tsv("dataProves.tsv", function(data) {
//seeData(data);
function seeData(data) {
console.log(data, function (d) {return d;});
var vis = d3.select("#visualisation"),
WIDTH = 1000,
HEIGHT = 500,
MARGINS = {
top: 20,
right: 20,
bottom: 20,
left: 50
},
//var x = new array("1","2","3","4","5","5","7","8","9","10","11","12");
xRange = d3.scale.linear().range([MARGINS.left, WIDTH - MARGINS.right]).domain([
0,
25
]),
yRange = d3.scale.linear().range([HEIGHT - MARGINS.top, MARGINS.bottom]).domain([
//Math.min(d3.min(data, function (d) {return +d;}),d3.min(data, function (d) {return +d;}))
0,10
//Math.max(d3.max(data, function (d) {return +d;}),d3.max(data, function (d) {return +d;}))
]),
xAxis = d3.svg.axis()
.scale(xRange)
.tickSize(5)
.tickSubdivide(true),
yAxis = d3.svg.axis()
.scale(yRange)
.tickSize(5)
.orient("left")
.tickSubdivide(true);
vis.append("svg:g")
.attr("class", "x axis")
.attr("transform", "translate(0," + (HEIGHT - MARGINS.bottom) + ")")
.call(xAxis);
vis.append("svg:g")
.attr("class", "y axis")
.attr("transform", "translate(" + (MARGINS.left) + ",0)")
.call(yAxis);
var lineFunc = d3.svg.line()
.x(function (d) {
return xRange(d);
})
.y(function (d) {
return yRange(d);
})
.interpolate('linear');
vis.append("svg:path")
.attr("d", lineFunc(data))
.attr("stroke", "blue")
.attr("stroke-width", 3)
.attr("fill", "none")
//acabar
.on('click', function(d) {
d3.select(this)
if(d3.select(this).attr("stroke")!= "red"){ d3.select(this) .attr("stroke", "red")}
else {d3.select(this) .attr("stroke", "blue")
d3.select(this) .attr("stroke-width", 3);}
})
.on('mouseover', function(d) {
d3.select(this)
.attr("stroke", "blue")
.attr("stroke-width", 9);
var mousecoord = [0,0];
mousecoord = d3.mouse(this);
d3.select("#tooltip")
.style("left", mousecoord[0] + "px")
.style("top", mousecoord[1]-40 + "px");
d3.select("#city")
.text("Denia");
d3.select("#tooltip").classed("hidden", false);
})
.on('mouseout', function(d) {
d3.select(this)
.attr("stroke", "blue")
.attr("stroke-width", 3);
d3.select("#tooltip").classed("hidden", true);
});
}
}
</script>
迪纳米克德尼亚
达累斯萨拉姆
.轴路径,.轴线
{
填充:无;
行程:777;
形状渲染:边缘清晰;
}
.轴文本
{
字体系列:“Arial”;
字体大小:13px;
}
打上钩
{
笔划数组:1,2;
}
.酒吧
{
填料:耐火砖;
}
#工具提示{
位置:绝对位置;
宽度:230px;
高度:自动;
填充:10px;
背景色:白色;
/*-webkit*/-边界半径:10px;
/*-moz*/-边界半径:10px;
边界半径:10px;
/*-webkit*/-box阴影:4px4px10px rgba(0,0,0,0.4);
/*-moz-*/box阴影:4px4px10pxrgba(0,0,0,0.4);
盒影:4px4x10pxRGBA(0,0,0,0.4);
指针事件:无;
}
#工具提示。隐藏{
显示:无;
}
#工具提示{
保证金:0;
字体系列:无衬线;
字体大小:16px;
线高:20px;
}
var socket=io.connect('http://localhost:3000/');
socket.on('connect',函数(数据){
setStatus(“已连接”);
emit('subscribe',{channel:'realtime'});
});
socket.on('重新连接',函数(数据){
设置状态(“重新连接”);
});
socket.on('message',函数(数据){
emit('update',{channel:'realtime'});
初始图表(数据);
log('dades:',data);
log('收到消息:',数据);
添加消息(数据);
});
函数addMessage(数据){
$('#online').html(数据);
}
函数setStatus(msg){
console.log('连接状态:'+msg);
}
函数初始化图(数据){
var数组=data.split(',');
seeData(数组);
//d3.tsv(“dataDL.tsv”),功能(数据){
//d3.tsv(“数据2.tsv”),功能(数据){
//seeData(数据);
//d3.tsv(“dataprovides.tsv”),函数(数据){
//seeData(数据);
函数seeData(数据){
log(数据,函数(d){返回d;});
var vis=d3。选择(“可视化”),
宽度=1000,
高度=500,
边距={
前20名,
右:20,,
底数:20,
左:50
},
//var x=新数组(“1”、“2”、“3”、“4”、“5”、“5”、“7”、“8”、“9”、“10”、“11”、“12”);
xRange=d3.scale.linear().range([MARGINS.left,WIDTH-MARGINS.right]).domain([
0,
25
]),
yRange=d3.scale.linear().range([HEIGHT-MARGINS.top,MARGINS.bottom]).domain([
//Math.min(d3.min(数据,函数(d){return+d;}),d3.min(数据,函数(d){return+d;}))
0,10
//max(d3.max(数据,函数(d){return+d;}),d3.max(数据,函数(d){return+d;}))
]),
xAxis=d3.svg.axis()
.刻度(X范围)
.尺寸(5)
.tickSubdivide(真),
yAxis=d3.svg.axis()
.刻度(Y量程)
.尺寸(5)
.东方(“左”)
.tickde(真);
vis.append(“svg:g”)
.attr(“类”、“x轴”)
.attr(“变换”、“平移(0)”+(高度-边距.底部)+”)
.呼叫(xAxis);
vis.append(“svg:g”)
.attr(“类”、“y轴”)
.attr(“转换”、“转换”(+(MARGINS.left)+“,0)”)
.呼叫(yAxis);
var lineFunc=d3.svg.line()
.x(功能(d){
返回范围(d);
})
.y(功能(d){
返回Y范围(d);
})
.插入(“线性”);
vis.append(“svg:path”)
.attr(“d”,lineFunc(数据))
.attr(“笔划”、“蓝色”)
.attr(“笔划宽度”,3)
.attr(“填充”、“无”)
//阿卡巴
.on('点击')功能(d){
d3.选择(本)
如果(d3.select(this.attr)(“stroke”)!=“red”){d3.select(this.attr)(“stroke”,“red”)}
else{d3.select(this.attr)(“stroke”,“blue”)
d3.选择(this).attr(“笔划宽度”,3);}
})
.on('mouseover',函数(d){
d3.选择(本)
.attr(“笔划”、“蓝色”)
.attr(“笔划宽度”,9);
var mousecoord=[0,0];
mousecoord=d3.鼠标(this);
d3.选择(“工具提示”)
.style(“左”,鼠标命令[0]+“px”)
.样式(“顶部”,鼠标命令[1]-40+“px”);
d3.选择(“城市”)
.文本(“Denia”);
d3.选择(“#工具提示”).classed(“隐藏”,false);
})
.on('mouseout',函数(d){
d3.选择(本)
.attr(“笔划”、“蓝色”)
.attr(“笔划宽度”,3);
d3.选择(“#工具提示”).classed(“隐藏”,true);
});
}
}
你知道为什么它工作得这么慢吗?为什么它只显示行中的第一个结果
谢谢
埃迪
我现在发布的代码很好地及时绘制了线条,但比例不正确,是固定的,而不是dinamic,因此我想创建一个动态onw,但它没有更新任何内容,因为我为数据创建了一个对象,而不是var array=data.split(“,”)。这是对象DATO的一个示例:
datos.x应为:0,1,2,3,4,5,6,7,8,9,10 datos.y应为:10,2,7,8,5,3,6,8,1,10,1
这里是我能够进行工作和绘图的代码:
<html>
<head>
<title>Dinamic Denia</title>
<svg id="visualisation" width="1000" height="500"></svg>
<body>
<div id="tooltip" class="hidden" style="left: 429px, top: 489.6px">
<p><strong><span id="city">Dar es Salaam</span></strong></p>
</div>
</body>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<script src="http://d3js.org/d3.v3.min.js"></script>
<!--Load the AJAX API-->
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript" src="http://localhost:3000/socket.io/socket.io.js"></script>
<style>
.axis path, .axis line
{
fill: none;
stroke: #777;
shape-rendering: crispEdges;
}
.axis text
{
font-family: 'Arial';
font-size: 13px;
}
.tick
{
stroke-dasharray: 1, 2;
}
.bar
{
fill: FireBrick;
}
#tooltip {
position: absolute;
width: 230px;
height: auto;
padding: 10px;
background-color: white;
/*-webkit*/-border-radius: 10px;
/*-moz*/-border-radius: 10px;
border-radius: 10px;
/*-webkit*/-box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4);
/*-moz-*/box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4);
box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4);
pointer-events: none;
}
#tooltip.hidden {
display: none;
}
#tooltip p {
margin: 0;
font-family: sans-serif;
font-size: 16px;
line-height: 20px;
}
</style>
<script type="text/javascript">
//InitChart();
//seeData();
var socket = io.connect('http://localhost:3000/');
var vis;
var lineFunc;
ini();
function ini(){
vis = d3.select("#visualisation"),//.append("svg"),
WIDTH = 1000,
HEIGHT = 500,
MARGINS = {
top: 20,
right: 20,
bottom: 20,
left: 50
},
xRange = d3.scale.linear().range([MARGINS.left, WIDTH - MARGINS.right]).domain([
0,
25
]),
yRange = d3.scale.linear().range([HEIGHT - MARGINS.top, MARGINS.bottom]).domain([
//Math.min(d3.min(data, function (d) {return +d;}),d3.min(data, function (d) {return +d;}))
0,25
//Math.max(d3.max(data, function (d) {return +d;}),d3.max(data, function (d) {return +d;}))
]),
xAxis = d3.svg.axis()
.scale(xRange)
.tickSize(5)
.tickSubdivide(true),
yAxis = d3.svg.axis()
.scale(yRange)
.tickSize(5)
.orient("left")
.tickSubdivide(true);
//var x = new array("1","2","3","4","5","5","7","8","9","10","11","12");
vis.append("svg:g")
.attr("class", "x axis")
.attr("transform", "translate(0," + (HEIGHT - MARGINS.bottom) + ")")
.call(xAxis);
vis.append("svg:g")
.attr("class", "y axis")
.attr("transform", "translate(" + (MARGINS.left) + ",0)")
.call(yAxis);
lineFunc = d3.svg.line()
.x(function (d) {
return xRange(d);
})
.y(function (d) {
return yRange(d);
})
.interpolate('linear');
vis.append("svg")
.append("path")
.attr("d", "0")
.attr("stroke", "blue")
.attr("stroke-width", 3)
.attr("fill", "none")
}
function throttle(fn, threshhold, scope) {
threshhold || (threshhold = 250);
var last,
deferTimer;
return function () {
var context = scope || this;
var now = +new Date,
args = arguments;
if (last && now < last + threshhold) {
// hold on to it
clearTimeout(deferTimer);
deferTimer = setTimeout(function () {
last = now;
fn.apply(context, args);
}, threshhold);
} else {
last = now;
fn.apply(context, args);
}
};
}
socket.on('connect', function(data){
setStatus('connected');
socket.emit('subscribe', {channel:'realtime'});
});
socket.on('reconnecting', function(data){
setStatus('reconnecting');
});
socket.on('message', throttle(function (data) {
seeData(data);
//console.log('tick');
}, 500));
//socket.emit('update', {channel:'realtime'});
//console.log('received a message: ', data);
//addMessage(data);
//});
function addMessage(data) {
$('#online').html(data);
console.log('dades: ', data);
//$('#visualisation').html(data);
}
function setStatus(msg) {
console.log('Connection Status : ' + msg);
}
function seeData(data){
var array = data.split(',');
var dades = d3.select("#visualisation").selectAll("path");
dades.attr("d", lineFunc(array))
//dades.enter().append("path")
.on('click', function(d) {
d3.select(this)
if(d3.select(this).attr("stroke")!= "red"){ d3.select(this) .attr("stroke", "red")}
else {d3.select(this) .attr("stroke", "blue")
d3.select(this) .attr("stroke-width", 3);}
})
.on('mouseover', function(d) {
d3.select(this)
.attr("stroke", "blue")
.attr("stroke-width", 9);
var mousecoord = [0,0];
mousecoord = d3.mouse(this);
d3.select("#tooltip")
.style("left", mousecoord[0] + "px")
.style("top", mousecoord[1]-40 + "px");
d3.select("#city")
.text("Denia");
d3.select("#tooltip").classed("hidden", false);
})
.on('mouseout', function(d) {
d3.select(this)
.attr("stroke", "blue")
.attr("stroke-width", 3);
d3.select("#tooltip").classed("hidden", true);
});
//dades.exit().remove();
}
// d3.tsv("dataDL.tsv", function(data) {
//d3.tsv("data2.tsv", function(data) {
//seeData(data);
// d3.tsv("dataProves.tsv", function(data) {
//seeData(data);
</script>
迪纳米克德尼亚
达累斯萨拉姆
.轴路径,.轴线
{
填充:无;
行程:777;
形状渲染:边缘清晰;
}
.轴文本
{
字体系列:“Arial”;
字体大小:13px;
}
<html>
<head>
<title>Dinamic Denia</title>
<svg id="visualisation" width="1000" height="500"></svg>
<body>
<div id="tooltip" class="hidden" style="left: 429px, top: 489.6px">
<p><strong><span id="city">Dar es Salaam</span></strong></p>
</div>
</body>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<script src="http://d3js.org/d3.v3.min.js"></script>
<!--Load the AJAX API-->
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript" src="http://localhost:3000/socket.io/socket.io.js"></script>
<style>
.axis path, .axis line
{
fill: none;
stroke: #777;
shape-rendering: crispEdges;
}
.axis text
{
font-family: 'Arial';
font-size: 13px;
}
.tick
{
stroke-dasharray: 1, 2;
}
.bar
{
fill: FireBrick;
}
#tooltip {
position: absolute;
width: 230px;
height: auto;
padding: 10px;
background-color: white;
/*-webkit*/-border-radius: 10px;
/*-moz*/-border-radius: 10px;
border-radius: 10px;
/*-webkit*/-box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4);
/*-moz-*/box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4);
box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4);
pointer-events: none;
}
#tooltip.hidden {
display: none;
}
#tooltip p {
margin: 0;
font-family: sans-serif;
font-size: 16px;
line-height: 20px;
}
</style>
<script type="text/javascript">
//InitChart();
//seeData();
var socket = io.connect('http://localhost:3000/');
var vis;
var lineFunc;
WIDTH = 1000,
HEIGHT = 500,
MARGINS = {
top: 20,
right: 20,
bottom: 20,
left: 50
};
xRange = d3.scale.linear().range([MARGINS.left, WIDTH - MARGINS.right]).domain([
0,
25
]),
yRange = d3.scale.linear().range([HEIGHT - MARGINS.top, MARGINS.bottom]).domain([
//Math.min(d3.min(data, function (d) {return +d;}),d3.min(data, function (d) {return +d;})),
0,
25
//Math.max(d3.max(data, function (d) {return +d;}),d3.max(data, function (d) {return +d;}))
]);
ini();
function ini(){
vis = d3.select("#visualisation"),//.append("svg"),
xAxis = d3.svg.axis()
.scale(xRange)
.tickSize(5)
.tickSubdivide(true),
yAxis = d3.svg.axis()
.scale(yRange)
.tickSize(5)
.orient("left")
.tickSubdivide(true);
//var x = new array("1","2","3","4","5","5","7","8","9","10","11","12");
vis.append("svg")
.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + (HEIGHT - MARGINS.bottom) + ")")
.call(xAxis);
vis.append("svg")
.append("g")
.attr("class", "y axis")
.attr("transform", "translate(" + (MARGINS.left) + ",0)")
.call(yAxis);
lineFunc = d3.svg.line()
.x(function (d) {
return xRange(d.x);
})
.y(function (d) {
return yRange(d.y);
})
.interpolate('linear');
vis.append("svg")
.append("path")
.attr("d", "0")
.attr("stroke", "blue")
.attr("stroke-width", 3)
.attr("fill", "none")
}
function throttle(fn, threshhold, scope) {
threshhold || (threshhold = 250);
var last,
deferTimer;
return function () {
var context = scope || this;
var now = +new Date,
args = arguments;
if (last && now < last + threshhold) {
// hold on to it
clearTimeout(deferTimer);
deferTimer = setTimeout(function () {
last = now;
fn.apply(context, args);
}, threshhold);
} else {
last = now;
fn.apply(context, args);
}
};
}
function createArray(length) {
var arr = new Array(length || 0),
i = length;
if (arguments.length > 1) {
var args = Array.prototype.slice.call(arguments, 1);
while(i--) arr[length-1 - i] = createArray.apply(this, args);
}
return arr;
}
socket.on('connect', function(data){
setStatus('connected');
socket.emit('subscribe', {channel:'realtime'});
});
socket.on('reconnecting', function(data){
setStatus('reconnecting');
});
socket.on('message', throttle(function (data) {
seeData(data);
//console.log('tick');
}, 500));
//socket.emit('update', {channel:'realtime'});
//console.log('received a message: ', data);
//addMessage(data);
//});
function addMessage(data) {
$('#online').html(data);
console.log('dades: ', data);
//$('#visualisation').html(data);
}
function setStatus(msg) {
console.log('Connection Status : ' + msg);
}
function prepara(data){
var arre = data.split(',');
var array = createArray(arre.length);
for (var i = 0; i < arre.length; i++) {
array[i]=""+i;
}
var datos = {x:array, y:arre};
xRange = d3.scale.linear().range([MARGINS.left, WIDTH - MARGINS.right]).domain([
d3.min(datos, function (d) {return +datos.x;}),
d3.max(datos, function (d) {return +datos.x;})
//0,
//arre.length
//Math.min(+datos.x),
//Math.max(+datos.x),
]),
yRange = d3.scale.linear().range([HEIGHT - MARGINS.top, MARGINS.bottom]).domain([
d3.min(datos, function (d) {return +datos.y;}),
d3.max(datos, function (d) {return +datos.y;})
//Math.min(+datos.y),
//0,
//25
//Math.max(+datos.y)
]);
console.log("d.x "+datos.x+" d.y "+datos.y);
return datos;
}
function seeData(data){
var dades = d3.select("#visualisation").selectAll("path");
dades.attr("d", lineFunc(prepara(data)))
.on('click', function(d) {
d3.select(this)
if(d3.select(this).attr("stroke")!= "red"){ d3.select(this) .attr("stroke", "red")}
else {d3.select(this) .attr("stroke", "blue")
d3.select(this) .attr("stroke-width", 3);}
})
.on('mouseover', function(d) {
d3.select(this)
.attr("stroke", "blue")
.attr("stroke-width", 9);
var mousecoord = [0,0];
mousecoord = d3.mouse(this);
d3.select("#tooltip")
.style("left", mousecoord[0] + "px")
.style("top", mousecoord[1]-40 + "px");
d3.select("#city")
.text("Denia");
d3.select("#tooltip").classed("hidden", false);
})
.on('mouseout', function(d) {
d3.select(this)
.attr("stroke", "blue")
.attr("stroke-width", 3);
d3.select("#tooltip").classed("hidden", true);
});
var rango = d3.select("#visualisation").selectAll("g.y.axis")
rango.call(yAxis);
var dominio = d3.select("#visualisation").selectAll("g.x.axis")
dominio.call(xAxis);
//dades.enter().append("path")
//dades.exit().remove();
}
// d3.tsv("dataDL.tsv", function(data) {
//d3.tsv("data2.tsv", function(data) {
//seeData(data);
// d3.tsv("dataProves.tsv", function(data) {
//seeData(data);
</script>