Javascript 如何从mysql中检索D3.Js中的动态数据进行实时绘图?
我正在尝试使用D3.js绘制实时数据。对于我遵循的条形图。这是我想要的真实情节,但不是通过“fakeData.json”文件,而是为了这个,我想从mysql检索动态数据。为了这个目的,我跟随。现在,我的问题:它可以很好地解决这个问题Javascript 如何从mysql中检索D3.Js中的动态数据进行实时绘图?,javascript,php,mysql,json,d3.js,Javascript,Php,Mysql,Json,D3.js,我正在尝试使用D3.js绘制实时数据。对于我遵循的条形图。这是我想要的真实情节,但不是通过“fakeData.json”文件,而是为了这个,我想从mysql检索动态数据。为了这个目的,我跟随。现在,我的问题:它可以很好地解决这个问题 d3.json("data.json", function (err, data){.... 但是当我将data.json替换为 d3.json("index.php", function (err, data){.... 我在输出中没有得到任何东西。我的问题看
d3.json("data.json", function (err, data){....
但是当我将data.json替换为
d3.json("index.php", function (err, data){....
我在输出中没有得到任何东西。我的问题看起来很相似,但找不到所需的结果。我的php代码(index.php)如下所示
`
而且,当复制并粘贴到data.json文件时,它的输出工作正常。我的data.json文件看起来
[
{"name":"John", "value":21088},
{"name":"Kathford", "value":297},
{"name":"King", "value":2095},
{"name":"Tylor", "value":64},
{"name":"Edward", "value":35},
{"name":"Saddey", "value":23},
{"name":"Sandy", "value":29},
{"name":" Rita ", "value":28},
{"name":"Stanley", "value":25},
{"name":"Hiung", "value":21},
{"name":"Chang", "value":19},
{"name":"Bokki", "value":30},
{"name":"Amzod", "value":15},
{"name":"Allure", "value":2000},
{"name":"Jim", "value":4011}
]
最后,整个绘图代码是
final.html
实时绘图
最高评级机构
数据来自
//更新Barchart.js
var设置=功能(targetID){
//设置svg元素和图表的大小
var margin={top:0,right:0,bottom:0,left:0},
宽度=600-边距。左侧-边距。右侧,
高度=400-margin.top-margin.bottom,
类别凹痕=4*15+5,
defaultBarWidth=2000;
//设置天平
var x=d3.scale.linear()
.domain([0,defaultBarWidth])
.范围([0,宽度]);
变量y=d3.scale.ordinal()
.rangeRoundBands([0,高度],0.1,0);
//创建SVG元素
d3.select(targetID).selectAll(“svg”).remove()
var svg=d3.select(targetID).append(“svg”)
.attr(“宽度”,宽度+边距。左侧+边距。右侧)
.attr(“高度”,高度+边距。顶部+边距。底部)
.附加(“g”)
.attr(“转换”、“平移”(+margin.left+)、“+margin.top+”);
//打包和导出设置
变量设置={
边距:边距,宽度:宽度,高度:高度,类别凹痕:类别凹痕,
svg:svg,x:x,y:y
}
返回设置;
}
var redrawChart=函数(targetID,newdata){
//导入设置
var margin=settings.margin,width=settings.width,height=settings.height,categoryIndent=settings.categoryIndent,
svg=settings.svg,x=settings.x,y=settings.y;
//重置域
y、 域(newdata.sort)(函数(a,b){
返回b.value-a.value;
})
.map(函数(d){返回d.Name;}));
var barmax=d3.max(新数据,函数(e){
返回e.value;
});
x、 域([0,barmax]);
/////////
//进入//
/////////
//将新数据绑定到图表行
//创建图表行并移动到图表底部下方
var chartRow=svg.selectAll(“g.chartRow”)
.data(newdata,函数(d){返回d.Name});
var newRow=chartRow
.输入()
.附加(“g”)
.attr(“类”、“图表行”)
.attr(“变换”、“平移(0)”+高度+边距.top+边距.bottom+”);
//添加矩形
newRow.insert(“rect”)
.attr(“类”、“条”)
.attr(“x”,0)
.attr(“不透明度”,0)
.attr(“高度”,y.rangeBand())
.attr(“宽度”,函数(d){返回x(d.value);})
//添加值标签
newRow.append(“文本”)
.attr(“类别”、“标签”)
.attr(“y”,y.rangeBand()/2)
.attr(“x”,0)
.attr(“不透明度”,0)
.attr(“dy”,“.35em”)
.attr(“dx”,“0.5em”)
.text(函数(d){返回d.value;});
//添加标题
newRow.append(“文本”)
.attr(“类别”、“类别”)
.attr(“文本溢出”、“省略号”)
.attr(“y”,y.rangeBand()/2)
.attr(“x”,类别凹痕)
.attr(“不透明度”,0)
.attr(“dy”,“.35em”)
.attr(“dx”,“0.5em”)
.text(函数(d){返回d.Name});
//////////
//更新//
//////////
//更新条宽度
chartRow.select(“.bar”).transition()
.持续时间(300)
.attr(“宽度”,函数(d){返回x(d.value);})
.attr(“不透明度”,1);
//更新数据标签
chartRow.select(“.label”).transition()
.持续时间(300)
.attr(“不透明度”,1)
.tween(“文本”,职能(d){
变量i=d3.interpolate(+this.textContent.replace(/\,/g',),+d.value);
返回函数(t){
this.textContent=Math.round(i(t));
};
});
//淡入类别
chartRow.select(“.category”).transition()
.持续时间(300)
.attr(“不透明度”,1);
////////
//出口//
////////
//淡出并移除退出元素
chartRow.exit().transition()
.style(“不透明度”、“0”)
.attr(“变换”、“平移(0)”+(高度+边距.顶部+边距.底部)+”)
.remove();
////////////////
//重新排列行//
////////////////
变量延迟=函数(d,i){return 200+i*30;};
chartRow.transition()
.延迟(延迟)
.持续时间(900)
.attr(“transform”,函数(d){return“translate(0),+y(d.Name)+”);};
};
//提取数据
//因为我们的数据是假的,所以添加一些随机更改来模拟数据流。
//使用回调,因为d3.json加载是异步的
var pullData=函数(设置、回调){
json(“index.php”,函数(err,data){
如果(错误)返回控制台。警告(错误);
var newData=数据;
data.forEach(函数(d,i){
var newValue=d.value
newData[i].value=newValue
[
{"name":"John", "value":21088},
{"name":"Kathford", "value":297},
{"name":"King", "value":2095},
{"name":"Tylor", "value":64},
{"name":"Edward", "value":35},
{"name":"Saddey", "value":23},
{"name":"Sandy", "value":29},
{"name":" Rita ", "value":28},
{"name":"Stanley", "value":25},
{"name":"Hiung", "value":21},
{"name":"Chang", "value":19},
{"name":"Bokki", "value":30},
{"name":"Amzod", "value":15},
{"name":"Allure", "value":2000},
{"name":"Jim", "value":4011}
]
<!DOCTYPE html>
<html>
<head>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<link rel="stylesheet" href="style1.css">
</head>
<body>
<div id="everything">
<h1>Real time plot</h1>
<h2>Top Rating Standing</h2>
<div id="chart"></div>
<h2>Data from<a href="#"> International Journal</a></h2>
</div>
<script>
//updatingBarChart.js
var setup = function(targetID){
//Set size of svg element and chart
var margin = {top: 0, right: 0, bottom: 0, left: 0},
width = 600 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom,
categoryIndent = 4*15 + 5,
defaultBarWidth = 2000;
//Set up scales
var x = d3.scale.linear()
.domain([0,defaultBarWidth])
.range([0,width]);
var y = d3.scale.ordinal()
.rangeRoundBands([0, height], 0.1, 0);
//Create SVG element
d3.select(targetID).selectAll("svg").remove()
var svg = d3.select(targetID).append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
//Package and export settings
var settings = {
margin:margin, width:width, height:height, categoryIndent:categoryIndent,
svg:svg, x:x, y:y
}
return settings;
}
var redrawChart = function(targetID, newdata) {
//Import settings
var margin=settings.margin, width=settings.width, height=settings.height, categoryIndent=settings.categoryIndent,
svg=settings.svg, x=settings.x, y=settings.y;
//Reset domains
y.domain(newdata.sort(function(a,b){
return b.value - a.value;
})
.map(function(d) { return d.Name; }));
var barmax = d3.max(newdata, function(e) {
return e.value;
});
x.domain([0,barmax]);
/////////
//ENTER//
/////////
//Bind new data to chart rows
//Create chart row and move to below the bottom of the chart
var chartRow = svg.selectAll("g.chartRow")
.data(newdata, function(d){ return d.Name});
var newRow = chartRow
.enter()
.append("g")
.attr("class", "chartRow")
.attr("transform", "translate(0," + height + margin.top + margin.bottom + ")");
//Add rectangles
newRow.insert("rect")
.attr("class","bar")
.attr("x", 0)
.attr("opacity",0)
.attr("height", y.rangeBand())
.attr("width", function(d) { return x(d.value);})
//Add value labels
newRow.append("text")
.attr("class","label")
.attr("y", y.rangeBand()/2)
.attr("x",0)
.attr("opacity",0)
.attr("dy",".35em")
.attr("dx","0.5em")
.text(function(d){return d.value;});
//Add Headlines
newRow.append("text")
.attr("class","category")
.attr("text-overflow","ellipsis")
.attr("y", y.rangeBand()/2)
.attr("x",categoryIndent)
.attr("opacity",0)
.attr("dy",".35em")
.attr("dx","0.5em")
.text(function(d){return d.Name});
//////////
//UPDATE//
//////////
//Update bar widths
chartRow.select(".bar").transition()
.duration(300)
.attr("width", function(d) { return x(d.value);})
.attr("opacity",1);
//Update data labels
chartRow.select(".label").transition()
.duration(300)
.attr("opacity",1)
.tween("text", function(d) {
var i = d3.interpolate(+this.textContent.replace(/\,/g,''), +d.value);
return function(t) {
this.textContent = Math.round(i(t));
};
});
//Fade in categories
chartRow.select(".category").transition()
.duration(300)
.attr("opacity",1);
////////
//EXIT//
////////
//Fade out and remove exit elements
chartRow.exit().transition()
.style("opacity","0")
.attr("transform", "translate(0," + (height + margin.top + margin.bottom) + ")")
.remove();
////////////////
//REORDER ROWS//
////////////////
var delay = function(d, i) { return 200 + i * 30; };
chartRow.transition()
.delay(delay)
.duration(900)
.attr("transform", function(d){ return "translate(0," + y(d.Name) + ")"; });
};
//Pulls data
//Since our data is fake, adds some random changes to simulate a data stream.
//Uses a callback because d3.json loading is asynchronous
var pullData = function(settings,callback){
d3.json("index.php", function (err, data){
if (err) return console.warn(err);
var newData = data;
data.forEach(function(d,i){
var newValue = d.value
newData[i].value = newValue <= 0 ? 10 : newValue
})
newData = formatData(newData);
callback(settings,newData);
})
}
//Sort data in descending order and take the top 10 values
var formatData = function(data){
return data.sort(function (a, b) {
return b.value - a.value;
})
.slice(0, 5);
}
//I like to call it what it does
var redraw = function(settings){
pullData(settings,redrawChart)
}
//setup (includes first draw)
var settings = setup('#chart');
redraw(settings)
//Repeat every 3 seconds
setInterval(function(){
redraw(settings)
}, 3000);
</script>
</body>