2015-01-27 2 views
0

На самом деле выход из моей зоны комфорта здесь - попытка получить представление о дереве с помощью разводного дерева Майка Бостокса. (оригинал на http://bl.ocks.org/mbostock/4339083).Использование переменной вместо внешнего файла для сценария d3

У меня есть код, который работает и ссылается на мой собственный файл данных json, но мне нужны данные в переменной вместо внешнего файла. (из-за ограничений платформы, на которой я использую визуализацию).

Следующий код вызывает файл с именем Objecttree.json, и я хочу, чтобы заменить это аналогичным названием переменной называется Objecttree.

Это должно быть мертвым, но я искал существующие ответы и не могу использовать ответы, приведенные в моем коде. Я думаю, что навыки даже ниже минимального порога noob, поэтому, пожалуйста, помните об этом!

в любом случае, спасибо заранее.

<meta charset="utf-8"> 
<style> 

.node { 
    cursor: pointer; 
} 

.node circle { 
    fill: #fff; 
    stroke: steelblue; 
    stroke-width: 1.5px; 
} 

.node text { 
    font: 10px sans-serif; 
} 

.link { 
    fill: none; 
    stroke: #ccc; 
    stroke-width: 1.5px; 
} 

</style> 
<body> 
<script src="http://d3js.org/d3.v3.min.js"></script> 
<script> 

var margin = {top: 20, right: 120, bottom: 20, left: 120}, 
    width = 3000 - margin.right - margin.left, 
    height = 1000 - margin.top - margin.bottom; 

var i = 0, 
    duration = 750, 
    root; 

var tree = d3.layout.tree() 
    .size([height, width]); 

var diagonal = d3.svg.diagonal() 
    .projection(function(d) { return [d.y, d.x]; }); 

var svg = d3.select("body").append("svg") 
    .attr("width", width + margin.right + margin.left) 
    .attr("height", height + margin.top + margin.bottom) 
    .append("g") 
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 

d3.json("Objecttree.json", function(error, flare) { 
    root = flare; 
    root.x0 = height/2; 
    root.y0 = 0; 

    function collapse(d) { 
    if (d.children) { 
     d._children = d.children; 
     d._children.forEach(collapse); 
     d.children = null; 
    } 
    } 

    root.children.forEach(collapse); 
    update(root); 
}); 

d3.select(self.frameElement).style("height", "800px"); 

function update(source) { 

    // Compute the new tree layout. 
    var nodes = tree.nodes(root).reverse(), 
     links = tree.links(nodes); 

    // Normalize for fixed-depth. 
    nodes.forEach(function(d) { d.y = d.depth * 180; }); 

    // Update the nodes… 
    var node = svg.selectAll("g.node") 
     .data(nodes, function(d) { return d.id || (d.id = ++i); }); 

    // Enter any new nodes at the parent's previous position. 
    var nodeEnter = node.enter().append("g") 
     .attr("class", "node") 
     .attr("transform", function(d) { return "translate(" + source.y0 + "," + source.x0 + ")"; }) 
     .on("click", click); 

    nodeEnter.append("circle") 
     .attr("r", 1e-6) 
     .style("fill", function(d) { return d._children ? "lightsteelblue" : "#fff"; }); 

    nodeEnter.append("text") 
     .attr("x", function(d) { return d.children || d._children ? -10 : 10; }) 
     .attr("dy", ".35em") 
     .attr("text-anchor", function(d) { return d.children || d._children ? "end" : "start"; }) 
     .text(function(d) { return d.name; }) 
     .style("fill-opacity", 1e-6); 

    // Transition nodes to their new position. 
    var nodeUpdate = node.transition() 
     .duration(duration) 
     .attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; }); 

    nodeUpdate.select("circle") 
     .attr("r", 4.5) 
     .style("fill", function(d) { return d._children ? "lightsteelblue" : "#fff"; }); 

    nodeUpdate.select("text") 
     .style("fill-opacity", 1); 

    // Transition exiting nodes to the parent's new position. 
    var nodeExit = node.exit().transition() 
     .duration(duration) 
     .attr("transform", function(d) { return "translate(" + source.y + "," + source.x + ")"; }) 
     .remove(); 

    nodeExit.select("circle") 
     .attr("r", 1e-6); 

    nodeExit.select("text") 
     .style("fill-opacity", 1e-6); 

    // Update the links… 
    var link = svg.selectAll("path.link") 
     .data(links, function(d) { return d.target.id; }); 

    // Enter any new links at the parent's previous position. 
    link.enter().insert("path", "g") 
     .attr("class", "link") 
     .attr("d", function(d) { 
     var o = {x: source.x0, y: source.y0}; 
     return diagonal({source: o, target: o}); 
     }); 

    // Transition links to their new position. 
    link.transition() 
     .duration(duration) 
     .attr("d", diagonal); 

    // Transition exiting nodes to the parent's new position. 
    link.exit().transition() 
     .duration(duration) 
     .attr("d", function(d) { 
     var o = {x: source.x, y: source.y}; 
     return diagonal({source: o, target: o}); 
     }) 
     .remove(); 

    // Stash the old positions for transition. 
    nodes.forEach(function(d) { 
    d.x0 = d.x; 
    d.y0 = d.y; 
    }); 
} 

// Toggle children on click. 
function click(d) { 
    if (d.children) { 
    d._children = d.children; 
    d.children = null; 
    } else { 
    d.children = d._children; 
    d._children = null; 
    } 
    update(d); 
} 

</script> 
+0

просто удалите вызов 'd3.json', переместите тело обратного вызова в основной код и замените' root = flare' на 'root = Objecttree'. –

+0

См. Http://stackoverflow.com/questions/22517967/using-d3-js-with-a-javascript-object-вместо-внешнего-json-файла или http://stackoverflow.com/questions/21639305/d3js-take-data-from-an-array -inst-of-a-file или http://stackoverflow.com/questions/15764698/loading-d3-js-data-from-a-simple-json-string или ... –

+0

Спасибо @PauloScardine, я думаю, что я почти это работает. Тело обратного вызова состоит в том, что все от «root = flare» до и включая «update (root)»; - если это так, я что-то упускаю, потому что это пока не работает. Я упомянул, что у меня есть над головой этот код? Спасибо за все ваше терпение в любом случае. – Sven

ответ

0

Попробуйте это:

var Objecttree = '{"type":"Topology","transform":{"scale":[0.06690766172651032,0.060532461291637356],"translate":[-7.240804475075604,51.182450466981884]},"objects":{"outerLine":{"type":"GeometryCollection","geometries":[{"type":"LineString","arcs":[0,1]},{"type":"LineString","arcs":[2,1]}]}},"arcs":[[[0,269],[41,82]],[[41,351],[115,70],[68,10],[35,3],[26,1],[11,-4]],[[295,429],[99,-39],[59,-48],[8,-82],[-34,-91],[-39,-84],[-63,-74],[-54,-11],[-54,12],[-41,8],[-103,82],[-56,66],[-10,114],[34,69]]]}'; 
var parsedObjecttree = JSON.parse(Objecttree); 

Наверняка это от себя JSON. Замените json вашими данными.

+0

не могли бы вы получить одинаковые результаты при удалении окружающих цитат? т. е. var Objecttree = {"type": "Топология", ....}, а затем используя это, а не parsedObjectree? Предполагая, конечно, что вы TRUST, что находится в переменной. Если у вас есть какие-либо сомнения, используйте JSON.parse, как было предложено. –

+0

Ну, это верно для большинства случаев. Но иногда объект json может содержать некоторые признаки, которые вредят коду. Поэтому гораздо безопаснее использовать специальную функцию, чтобы убедиться, что она всегда работает. Я не знаю, какой знак это был, но у меня был действительно большой json-файл и он использовал его без JSON.parse, и это не сработало. – kwoxer

Смежные вопросы