D3.js 简介D3 的全称是(Data-Driven Documents),顾名思义可以知道是一个被数据驱动的文档。听名字有点抽象,说简单一点,其实就是一个 JavaScript 的函数库,使用它主要是用来做数据可视化的。 D3的特点是通过JavaScript代码实现svg图标。 D3图表和ThingJS结合方法有ThingJS平台目前只有在线开发的方式,故需要通过html5的postMessage 消息机制来实现图标和ThingJS中的3D场景交互。 D3图表实现首先用D3代码画一个饼图。 代码如下: - var data = [
- ['叉车', 11964],
- ['轿车', 18799],
- ['警车', 51966],
- ['皮卡', 35876],
- ];
- var width = 400,
- height = 400;
- //div--svg--g--pie--text
-
- //SVG
- var svg = d3.select("#container")
- .append("svg")
- .attr("width", width)
- .attr("height", height)
-
-
- svg.append("g")
- .append("text")
- .text('车辆销售饼图')
- .attr("class", "subTitle")
- .attr("x", 6)
- .attr("y", 18);
-
- //g
- var g = svg.append("g")
- .attr("transform", "translate(200,200)")
-
- var arc_generator = d3.svg.arc()
- .innerRadius(100)
- .outerRadius(200);
-
- var angle_data = d3.layout.pie()
- .value(function (d) {
- return d[1];
- })
-
- var color = d3.scale.category10();
-
- //pie
- g.selectAll("path")
- .data(angle_data(data))
- .enter()
- .append("path")
- .attr("d", arc_generator)
- .style("fill", function (d, i) {
- return color(i);
- })
-
-
- //text
- g.selectAll("text")
- .data(angle_data(data))
- .enter()
- .append("text")
- .text(function (d) {
- return d.data[0];
- })
- .attr("transform", function (d) {
- return "translate(" + arc_generator.centroid(d) + ")";
- })
- .attr("text-anchor", "middle");
复制代码图表的效果如下图: ThingJS 3D场景实现然后在ThingJS平台搭建一个车辆的场景如下图: D3图表和ThingJS通讯- var iframeDom = document.getElementById('I0');
- //pie
- g.selectAll("path")
- .data(angle_data(data))
- .enter()
- .append("path")
- .attr("d", arc_generator)
- .style("fill", function (d, i) {
- return color(i);
- })
- .on("mouseover", function (d, i) {
- //console.log(d);
- console.log(i);
- iframeDom.contentWindow.postMessage(i, '*');
- })
- .on("mouseout", function (d, i) {
- console.log(-1);
- iframeDom.contentWindow.postMessage(-1, '*');
- });
复制代码ThingJS接收到消息对3d对象勾边 - // 接收iframe页面传送的数据
- window.addEventListener('message', function (e) {
- var data = e.data;
- if (data == -1) {
- var selector = app.query('*');
- selector.style.outlineColor = null;
- } else {
- var selector = app.query('#1' + data);
- selector.style.outlineColor = '#ff0000';
- }
- })
复制代码最后完整代码如下: - <!DOCTYPE html>
- <html>
-
- <head>
- <meta charset="UTF-8">
- </head>
-
- <body style="margin: 0px">
- <div id="container" style="position:absolute; z-index: 2; margin: 15px"></div>
-
- <iframe id='I0' style="position:absolute; width: 100%; height: 100%;"
- src='https://www.thingjs.com/guide/sampleindex.html?m=oLX7p04daC2OdoZCbP6VihD_0XCo/01E401B901B0201E801BD01A6.js?n=7027'></iframe>
-
- <script src='js/d3.v3.js'></script>
- <script>
- // var iframeDom = window.frames[0];
- var iframeDom = document.getElementById('I0');
- var data = [
- ['叉车', 11964],
- ['轿车', 18799],
- ['警车', 51966],
- ['皮卡', 35876],
- ];
- var width = 400,
- height = 400;
- //div--svg--g--pie--text
-
- //SVG
- var svg = d3.select("#container")
- .append("svg")
- .attr("width", width)
- .attr("height", height)
-
-
- svg.append("g")
- .append("text")
- .text('车辆销售饼图')
- .attr("class", "subTitle")
- .attr("x", 6)
- .attr("y", 18);
-
- //g
- var g = svg.append("g")
- .attr("transform", "translate(200,200)")
-
- var arc_generator = d3.svg.arc()
- .innerRadius(100)
- .outerRadius(200);
-
- var angle_data = d3.layout.pie()
- .value(function (d) {
- return d[1];
- })
-
- var color = d3.scale.category10();
-
- //pie
- g.selectAll("path")
- .data(angle_data(data))
- .enter()
- .append("path")
- .attr("d", arc_generator)
- .style("fill", function (d, i) {
- return color(i);
- })
- .on("mouseover", function (d, i) {
- //console.log(d);
- console.log(i);
- iframeDom.contentWindow.postMessage(i, '*');
- })
- .on("mouseout", function (d, i) {
- console.log(-1);
- iframeDom.contentWindow.postMessage(-1, '*');
- });
-
- //text
- g.selectAll("text")
- .data(angle_data(data))
- .enter()
- .append("text")
- .text(function (d) {
- return d.data[0];
- })
- .attr("transform", function (d) {
- return "translate(" + arc_generator.centroid(d) + ")";
- })
- .attr("text-anchor", "middle");
- </script>
- </body>
-
- </html>
复制代码ThingJS平台完整代码: - var app = new THING.App({
- // 场景地址
- "url": "https://www.thingjs.com/./client/ThingJS/11606/20190126172532891305936",
- //背景设置
- "skyBox": "BlueSky"
- });
-
- // 接收iframe页面传送的数据
- window.addEventListener('message', function (e) {
- var data = e.data;
- if (data == -1) {
- var selector = app.query('*');
- selector.style.outlineColor = null;
- } else {
- var selector = app.query('#1' + data);
- selector.style.outlineColor = '#ff0000';
- }
- })
复制代码最后效果如图:
|