2017-09-23 1 views
0

私は現在d3ライブラリで作業しています。私は2つの外部jsスクリプトを読み込むHTMLファイルを持っています。 1つのスクリプトはd3強制グラフを作成し、もう1つはハイチャートグラフを作成します。d3グラフハイチャートでフリーズ

現時点で直面している問題は、ハイチャートチャートがプロットされているときにグラフレイアウトがフリーズしていることです。タイムアウトを使用してチャートのプロットを遅らせることで、チャートが問題であることを確信できます。チャートをプロットすると、次のエラーがスローされます。次のコードで

Uncaught TypeError: Cannot read property 'x' of undefined 

force.on("tick", function() 
{ 
link.attr("x1", function (d) {return d.source.x;}) 
    .attr("y1", function (d) {return d.source.y;}) 
    .attr("x2", function (d) {return d.target.x;}) 
    .attr("y2", function (d) {return d.target.y;}); 

d3.selectAll("circle") 
    .attr("cx", function (d) {return d.x;}) //<- error 
    .attr("cy", function (d) {return d.y;}); 

d3.selectAll("text") 
    .attr("x", function (d) {return d.x;}) //<- error 
    .attr("y", function (d) {return d.y;}); 
}); 

私はhighchartsはD3ライブラリへの副作用を持つべき理由はわかりません。任意の提案

ため

おかげで[EDIT]最小限の例のスクリプトを読み込む

htmlファイル:

<head> 
    <!-- d3 library --> 
    <script type="text/javascript" src="js/d3.min.js"></script> 
    <!-- highchart library --> 
    <script type="text/javascript" src="js/highcharts.min.js"></script> 
    <!-- chart style --> 
    <script type="text/javascript" src="js/chart_style.js"></script> 
</head> 
<body> 
    <!-- here the d3 graph gets created --> 
    <script type="text/javascript" src="js/d3_script.js"></script> 

    <!-- here the chart gets created --> 
    <!--<script type="text/javascript" src="js/chart.js"></script>--> 
</body> 

D3スクリプト:

// Setup 
var color = d3.scale.category20(); 
var width = window.innerWidth; 
var height = window.innerHeight; 
var power = -100; 
var distance = 100; 
var svg = d3.select("body").append("svg").attr("width", '100%').attr("height", height); 
var force = d3.layout.force().charge(power).linkDistance(distance).size([width, height]); 
var graph = {nodes:[{name : "A"}, {name : "B"}], links: [{source: 0, target : 1}]}; 
force.nodes(graph.nodes).links(graph.links).start(); 

// Tooltip 
var tooltip = d3.select("body").append("div") 
    .attr("class", "tooltip") 
    .style("opacity", 0); 

// Links 
var link = svg.selectAll(".link") 
    .data(graph.links) 
    .enter().append("line") 
    .attr("class", "link") 
    .style("stroke-width", function (d) { return 1}); 

// Nodes 
var node = svg.selectAll(".node") 
    .data(graph.nodes) 
    .enter() 
    .append("g") 
    .attr("class", "node") 
    .attr("id", function(d){ return "group-" + d.group}) 
    .call(force.drag) 
    .append("circle") 
    .attr("r", 8) 
    .style("fill", function (d) {return color(d.group); }) 
    .on("mouseover", function(d,i) { 
     tooltip.transition().duration(200).style("opacity", .9); 
     tooltip.html(d.name) 
     .style("left", (d3.event.pageX - d.name.length*3) + "px") 
     .style("top", (d3.event.pageY - 35) + "px"); 
    }) 
    .on("mouseout", function(d) { 
     tooltip.transition().duration(500).style("opacity", 0); 
    }); 

// Update 
force.on("tick", function() 
{ 
    link.attr("x1", function (d) {return d.source.x;}) 
     .attr("y1", function (d) {return d.source.y;}) 
     .attr("x2", function (d) {return d.target.x;}) 
     .attr("y2", function (d) {return d.target.y;}); 

    d3.selectAll("circle") 
     .attr("cx", function (d) {return d.x;}) 
     .attr("cy", function (d) {return d.y;}); 

    d3.selectAll("text") 
     .attr("x", function (d) {return d.x;}) 
     .attr("y", function (d) {return d.y;}); 
}); 

チャートスクリプト:

setTimeout(function() 
{ 
    document.getElementsByTagName('body')[0].innerHTML += "<div id='dummy'></div>";Highcharts.chart('dummy', {series: [{name: 'Test1', data: [0, 1, 2, 3]}]}); 
}, 2000); 
+1

こんにちは@chriszo、あなたの問題を示すいくつかの最小限のライブの作業例を教えてください。 –

+0

は最小限の例を示しました – chriszo

答えて

0

グラフのタイムアウト機能で問題を解決しました。グラフが最初にプロットされたらどういうわけか。

関連する問題