d3 tree類似“股權穿透圖”

寫類似天眼查的 “股權穿透圖”,樹形結構。

https://codepen.io/myGitHubForJava/pen/EMEPdW

https://codepen.io/bendcarmen/pen/BzZGqw

https://codepen.io/TheSeTh/pen/RGBKxx

https://codepen.io/zhulinpinyu/pen/EaZrmM/

 

 下面是去掉按鈕後的效果。還行。但是有個問題,我自己的頁面是個有滾動條的網頁。那麼這個樹形的滾動效果,和滾動條的重合了。很不好。還有拖動。都不知道拖動到哪裏去了。


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">

<title>CodePen - d3樹圖</title>
<script>
  window.console = window.console || function(t) {};
</script>
<script>
  if (document.location.search.match(/type=embed/gi)) {
    window.parent.postMessage("resize", "*");
  }
</script>
</head>
<body translate="no">
<svg width='1280' height="860"></svg>
<script src='https://cdnjs.cloudflare.com/ajax/libs/d3/5.9.2/d3.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js'></script>
<script id="rendered-js">
      var dataset = {
  name: "中國",
  children: [
  {
    name: "浙江",
    children: [
    { name: "杭州", value: 100 },
    { name: "寧波", value: 100 },
    { name: "溫州", value: 100 },
    { name: "紹興", value: 100 }] },


  {
    name: "廣西",
    children: [
    {
      name: "桂林",
      children: [
      { name: "秀峯區", value: 100 },
      { name: "疊彩區", value: 100 },
      { name: "象山區", value: 100 },
      { name: "七星區", value: 100 }] },


    { name: "南寧", value: 100 },
    { name: "柳州", value: 100 },
    { name: "防城港", value: 100 }] },


  {
    name: "黑龍江",
    children: [
    { name: "哈爾濱", value: 100 },
    { name: "齊齊哈爾", value: 100 },
    { name: "牡丹江", value: 100 },
    { name: "大慶", value: 100 }] },


  {
    name: "新疆",
    children:
    [
    { name: "烏魯木齊" },
    { name: "克拉瑪依" },
    { name: "吐魯番" },
    { name: "哈密" }] }] };





var marge = { top: 60, bottom: 0, left: 30, right: 0 };

var svg = d3.select("svg");
var width = svg.attr("width");
var height = svg.attr("height");

var g = svg.append("g").
attr("transform", "translate(" + marge.top + "," + marge.left + ")");


let hierarchyData = d3.hierarchy(dataset).
sum(function (d) {
  return d.value;
});
let tree = d3.tree().
size([width - 100, height - 100]).
separation(function (a, b) {
  return a.parent == b.parent ? 1 : 1;
});

let treeData = tree(hierarchyData);

let nodes = treeData.descendants().map(item => {
  item.show = false;
  return item;
});
let links = treeData.links();
let beziler_generator = d3.linkHorizontal().
x(function (d) {
  return d.x;
}).
y(function (d) {
  return d.y;
});
// 邊
g.append('g').
selectAll('path').
data(links).
enter().
append('path').
attr('d', function (d, i) {
  var start = { x: d.source.x, y: d.source.y };
  var end = { x: d.target.x, y: d.target.y };
  return beziler_generator({ source: start, target: end });
}).
attr('fill', 'none').
attr('stroke', 'blue').
attr('stroke-width', '1');

let gs = g.append('g').
selectAll('g').
data(nodes).
enter().
append('g').
attr('transform', function (d) {
  return 'translate(' + d.x + ',' + d.y + ')';
}).
attr('cursor', 'pointer').
on('mouseover', function (d, i, context) {
  console.log(this);
  d3.select(this).select('.detail').style('display', 'block');
}).
on('mouseout', function () {
  d3.select(this).select('.detail').style('display', 'none');
});

gs.append('text').
attr('x', function (d) {
  return 30 - d.data.name.length * 8;
}).
text(function (d) {
  return d.data.name;
}).
attr('class', 'detail').
attr('style', function (d) {
  return d.show ? 'display:block' : 'display:none';
});

gs.append('circle').
attr('r', 6).
attr('fill', 'white').
attr('stroke', 'blue').
attr('stroke-width', 1).
attr('x', function (d) {
  return d.x;
});

gs.append('text').
attr('x', function (d) {
  return -d.data.name.length * 8;
}).
attr('y', function (d) {
  return d.children ? -10 : 20;
}).
text(function (d) {
  return d.data.name;
});
 
let zoom = d3.zoom().scaleExtent([1, 5]).extent([[0, 0], [width, height]]).on('zoom', zoomed);
zoom(svg);

function zoomed(d, i, context) {
  g.attr('transform', d3.zoomTransform(this));
  // svg.call(zoom.transform, d3.zoomTransform(this))
}

console.log(1, treeData, nodes, links);
      //# sourceURL=pen.js
    </script>
</body>
</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章