D3的第一次嘗試--bubble

d3版本5.9.2css

d3的bubble圖,主要用的是d3.pack(),是一種數據的處理,經過計算使全部的bubble都不重疊。html

d3.pack()會返回每條數據的x,y軸的座標以及半徑r,這樣你就能夠根據返回的數據佈局。node

在這個過程當中遇到的坑:app

一、因爲版本的問題,好多函數一直報錯,3版本和4版本以上有不少不一樣svg

二、我想要的效果是個長方形,可他一直渲染成正方形函數

     這個緣由是,這個包佈局,是有一個根節點,會把全部的子節點都包在一塊兒,因此說他的計算範圍依然是一個園,因此不可能渲染成長方形,可是能夠本身手動計算佈局

三、在設置樣式的時候也和普通的css不一樣url

     線: strokespa

     背景色: fillcode

效果:

html:

<section id="graph" style="width: 100%; height: 150px"></section>

style:

.add-green-color {
    stroke: #50E3C2;
    fill: #50E3C2;
    fill-opacity: 0.25;
  }

js:

const data = [{
      name: '感受不錯',
      value: 185,
    }, {
      name: '玩的開心',
      value: 88,
    }, {
      name: '景色美',
      value: 35,
    }, {
      name: '態度好',
      value: 63,
    }, {
      name: '感受不錯',
      value: 185,
    }, {
      name: '玩的開心',
      value: 88,
    }, {
      name: '景色美',
      value: 35,
    }, {
      name: '態度好',
      value: 63,
    }];
    data.forEach((t, index) => {
      t.id = index;
    });
    const elementGraph = document.getElementById('graph');
    const boxWidth = elementGraph === null ? 0 : elementGraph.clientWidth;
    const packs = (wordData) => d3.pack()
    .size([boxWidth, 150])
    .padding(3)
    (d3.hierarchy({children: wordData})
    .sum((d) => d.value));
    const root = packs(data);

    const svg = d3.select('#graph').append('svg')
    .style('width', '100%')
    .style('height', '100%')
    .attr('font-family', 'sans-serif')
    .attr('font-weight', 'bold')
    .attr('text-anchor', 'middle');

    const leaf = svg.selectAll('g')
    .data(root.leaves())
    .join('g')
    .attr('transform', (d) => `translate(${(d.x - 70) * 2},${d.y})`);

    leaf.append('circle')
    .attr('r', (d) => d.r)
    .attr('class', 'add-green-color');

    leaf.append('clipPath')
    .attr('id', (d) => 'cover-' + d.data.id)
    .append('circle')
    .attr('fill', '#ffffff')
    .attr('r', (d) => d.r);


    leaf.append('text')
    .attr('clip-path', (d) => 'url(#cover-' + d.data.id + ')')
    .attr('font-size', (d) => {
      const num = Math.ceil(d.data.value / 15);
      return num > 18 ? 18 : num < 8 ? 8 : num;
    })
    .selectAll('tspan')
    .data((d) => d.data.name.split(/(?=[A-Z][^A-Z])/g))
    .join('tspan')
    .attr('x', 0)
    .attr('y', (d, i, nodes) => `${i - nodes.length / 2 + 0.8}em`)
    .attr('fill', '#ffffff')
    .text((d) => d);
    return svg.node();

遮罩(clipPath)參考:http://www.javashuo.com/article/p-tfkqgivm-dw.html

相關文章
相關標籤/搜索