0

そこで、以下のような質問フローチャートを作成したいと思います: 「質問フロー」チャートの例 開始するのに最適な場所がわからない... これは有向グラフですか? それらのいくつかは、実際には間隔が空いており、「フロー」には見栄えがよくありません: https://observablehq.com/@d3/force-directed-graph

私が見た最良の例は、非 D3 ライブラリ (yworks) ですが、15,000 ドルかかるようです: yworksの例 これは、私が見た唯一の関連する StackOverflow であり、yworks を参照しているだけです:フロー チャートを作成できますか (ツリー チャートはありません) D3.js の使用 おそらく、この dagre-d3 の例も同様です: http://jsfiddle.net/armyofda12mnkeys/9L50of2c/2/

var g = new dagreD3.graphlib.Graph().setGraph({});

私が追加したいいくつかのクールなオプションのもの:

*また、そのノードのデータに基づいて特定の状況でいくつかの赤を緑色にするなど、サークルの css を制御できるようにしたいと考えています。

*各エッジ矢印 onHovers イベントも追加したいので、「if(Question1 == A || B)」のような実際のルールを示すツールチップが表示されます

*ノード/エッジをドラッグ可能または「弾む」ようにします (ドラッグすると元の場所に戻ります)。ギミックに聞こえるかもしれませんが、(スマート自動レイアウトのせいで) ルールがぎこちなくなりすぎて、何かをドラッグして、どの矢印がどこを指しているかを確認したい場合に、ユーザーがこの機能を使用することがあります。

4

1 に答える 1

6

dagre-d3で取得したと思います。ここに私の最初の jsfiddle があります: http://jsfiddle.net/armyofda12mnkeys/4gv90qhx/2/

また、エッジにもポップアップがある同じ例があります(ただし、ノードのポップアップほど実装は好きではありません) http://jsfiddle.net/armyofda12mnkeys/4gv90qhx/37/

これは、糖尿病アンケートのプロジェクトで使用している方法の完全な例です (コードを最新の d3.v5+dagre にアップグレードし、ノードとエッジをドラッグ可能にしました...取得する初期 JSON 解析コードがたくさんあります申し訳ありませんが、実際にループできる形式に変換します): https://jsfiddle.net/armyofda12mnkeys/1burht5j/44/ 注: この最後のリンクは、使用している「cors-anywhere」Web サイトがダウンしている場合は機能しない可能性があります。それではダウンロードしてみてください。

// Create a new directed graph
var g = new dagreD3.graphlib.Graph().setGraph({});

var nodes = [ 
{'qs_code':"QS1", 'hovertext': 'This is QS1', 'proto_logic_type': 'none' },
{'qs_code':"QS2", 'hovertext': 'This is QS2', 'proto_logic_type': 'disqualify'},
{'qs_code':"QS3", 'hovertext': 'This is QS3', 'proto_logic_type': 'qualify'},
{'qs_code':"QS4", 'hovertext': 'This is QS4', 'proto_logic_type': 'both'},
{'qs_code':"QS5", 'hovertext': 'This is QS5', 'proto_logic_type': 'none'},
{'qs_code':"QS6", 'hovertext': 'This is QS6', 'proto_logic_type': 'none'}
];

// Automatically label each of the nodes
nodes.forEach(function(node) {
    g.setNode(node.qs_code, { label: node.qs_code, shape: "circle", class: [node.proto_logic_type], hovertext: node.hovertext  });  //style: 'fill: red' 
});

// Set up the edges
g.setEdge("QS1", "QS2", { label: "<u onmouseover='(function(){ return $(\"#tooltip_template\").css(\"visibility\", \"visible\"); })()' onmouseout='(function(){ return $(\"#tooltip_template\").css(\"visibility\", \"hidden\"); })()' onmousemove='(function(){ $(\"#tooltip_template\").html(\"AAA&amp;gt;BBB\").css(\"top\", (event.pageY-10)+\"px\").css(\"left\",(event.pageX+10)+\"px\"); })()'>Rule1</u>", hovertext:"A>B", labelType: "html" });
g.setEdge("QS1", "QS3", { label: "<u onmouseover='(function(){ return $(\"#tooltip_template\").css(\"visibility\", \"visible\"); })()' onmouseout='(function(){ return $(\"#tooltip_template\").css(\"visibility\", \"hidden\"); })()' onmousemove='(function(){ $(\"#tooltip_template\").html(\"AAA&amp;lt;BBB\").css(\"top\", (event.pageY-10)+\"px\").css(\"left\",(event.pageX+10)+\"px\"); })()'>Rule2</u>", hovertext:"A<B", labelType: "html" });
g.setEdge("QS1", "QS4", { label: "<u onmouseover='(function(){ return $(\"#tooltip_template\").css(\"visibility\", \"visible\"); })()' onmouseout='(function(){ return $(\"#tooltip_template\").css(\"visibility\", \"hidden\"); })()' onmousemove='(function(){ $(\"#tooltip_template\").html(\"AAA==BBB\").css(\"top\", (event.pageY-10)+\"px\").css(\"left\",(event.pageX+10)+\"px\"); })()'>Rule3</u>", hovertext:"A==B", labelType: "html" });

g.setEdge("QS2", "QS5", { label: "Rule1", arrowhead: "vee", hovertext:"(A+B)>1" });

g.setEdge("QS3", "QS5", { label: "Rule1", hovertext:"(A-B)<2" });
g.setEdge("QS3", "QS6", { label: "Rule2", hovertext:"(A*B)>=3" });

g.setEdge("QS4", "QS6", { label: "Rule2", arrowhead: "vee", hovertext:"(A>10)||(B<20)" });


var svg = d3.select("svg"),
    inner = svg.select("g");

// Set the rankdir
g.graph().rankdir = 'TB';//'LR';
g.graph().nodesep = 50;

// Set up zoom support
var zoom = d3.behavior.zoom().on("zoom", function() {
      inner.attr("transform", "translate(" + d3.event.translate + ")" +
                                  "scale(" + d3.event.scale + ")");
    });
svg.call(zoom);

// Create the renderer
var render = new dagreD3.render();


// Run the renderer. This is what draws the final graph.
render(inner, g);


var tooltip = d3.select("body")
    .append("div")
  .attr('id', 'tooltip_template')
    .style("position", "absolute")
    .style("background-color", "white")
  .style("border", "solid")
  .style("border-width", "2px")
  .style("border-radius", "5px")  
  .style("padding", "5px")
    .style("z-index", "10")
    .style("visibility", "hidden")
    .text("Simple Tooltip...");

inner.selectAll('g.node')
  .attr("data-hovertext", function(v) { 
        return g.node(v).hovertext
    })
    .on("mouseover", function(){return tooltip.style("visibility", "visible");})
    .on("mousemove", function(){ 
    tooltip.text( this.dataset.hovertext)   
        .style("top", (event.pageY-10)+"px")
        .style("left",(event.pageX+10)+"px");
  })
    .on("mouseout", function(){return tooltip.style("visibility", "hidden");});

inner.selectAll('g.edgePath')
//inner.selectAll('path')
.append('title').text('This is a line.');

// Center the graph
var initialScale = 0.75;
zoom
  .translate([(svg.attr("width") - g.graph().width * initialScale) / 2, 20])
  .scale(initialScale)
  .event(svg);
svg.attr('height', g.graph().height * initialScale + 40);
于 2019-05-03T20:10:07.293 に答える