d3チャートを正しくズームする方法は?

Hctor Aldair Aguilar Hernndez

d3ワードクラウドレイアウトでチャートを作成しました。d3.zoom()を使用してズームしたい。問題は、ズーム機能を実装すると、SVGが範囲外になることです。この例のように:https//codepen.io/bitbyte/pen/oVKGjx

var words = ["two", "two", "seven", "seven", "seven", "seven", "seven", "seven", "seven", "three", "three", "three", "eight", "eight", "eight", "eight", "eight", "eight", "eight", "eight", "five", "five", "five", "five", "five", "four", "four", "four", "four", "nine", "nine", "nine", "nine", "nine", "nine", "nine", "nine", "nine", "one", "ten", "ten", "ten", "ten", "ten", "ten", "ten", "ten", "ten", "ten", "six", "six", "six", "six", "six", "six"]
        .map(function(d,i) {
            //console.log(d);
            return {text: d, size: -i};
        });

var fontName = "Impact",
    cWidth = 720,
    cHeight = 400,
    svg,
    wCloud,
    bbox,
    ctm,
    bScale,
    bWidth,
    bHeight,
    bMidX,
    bMidY,
    bDeltaX,
    bDeltaY;

var cTemp = document.createElement('canvas'),
    ctx = cTemp.getContext('2d');
    ctx.font = "100px " + fontName;

var fRatio = Math.min(cWidth, cHeight) / ctx.measureText(words[0].text).width,
    fontScale = d3.scale.linear()
        .domain([
            d3.min(words, function(d) { return d.size; }), 
            d3.max(words, function(d) { return d.size; })
        ])
        //.range([20,120]),
        .range([20,100*fRatio/2]), // tbc
    fill = d3.scale.category20();

d3.layout.cloud()
    .size([cWidth, cHeight])
    .words(words)
    //.padding(2) // controls
    .rotate(function() { return ~~(Math.random() * 2) * 90; })
    .font(fontName)
    .fontSize(function(d) { return fontScale(d.size) })
    .on("end", draw)
    .start();

function draw(words, bounds) {
    // move and scale cloud bounds to canvas
    // bounds = [{x0, y0}, {x1, y1}]
    bWidth = bounds[1].x - bounds[0].x;
    bHeight = bounds[1].y - bounds[0].y;
    bMidX = bounds[0].x + bWidth/2;
    bMidY = bounds[0].y + bHeight/2;
    bDeltaX = cWidth/2 - bounds[0].x + bWidth/2;
    bDeltaY = cHeight/2 - bounds[0].y + bHeight/2;
    bScale = bounds ? Math.min( cWidth / bWidth, cHeight / bHeight) : 1;



    svg = d3.select(".cloud").append("svg")
        .attr("width", cWidth)
        .attr("height", cHeight)
     .call(d3.behavior.zoom().on("zoom", function () {
    svg.attr("transform", "translate(" + d3.event.translate + ")" + " scale(" + d3.event.scale + ")")
  }))


    wCloud = svg.append("g")

        .attr("transform", "translate(360,200)")
        .selectAll("text")
        .data(words)
        .enter().append("text")
        .style("font-size", function(d) { return d.size + "px"; })
        .style("font-family", fontName)
        .style("fill", function(d, i) { return fill(i); })
        .attr("text-anchor", "middle")
        .transition()
        .duration(500)
        .attr("transform", function(d) {
            return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
        })
        .text(function(d) { return d.text; });

    bbox = wCloud.node(0).getBBox();


};

このようなズームチャートを作成する正しい方法は何ですかhttps://bl.ocks.org/sgruhier/50990c01fe5b6993e82b8994951e23d0

SVGが内部にある正方形の固定コンテナで、ズームインしたときにすべてのページで移動することはありません。

Cornel Stefanache

これがあなたのソリューションで更新されたcodepenです:https://codepen.io/cstefanache/pen/ZPgmwy

ユーザーがSVGビューポートをさらにマウスで操作できるようにするには、SVGDOMに直接ではなくグループ要素に変換を適用する必要があります。

.call(d3.behavior.zoom().on("zoom", function () {
    groupElement.attr("transform", "translate(" + d3.event.translate + ")" + " scale(" + d3.event.scale + ")")
}))

元のコードペンへの変更は、使用するためにワードクラウドグループへの参照を保存し、その参照にすべての変更を適用することでした

wCloud = svg.append("g");   
wCloud.selectAll("text")
    .data(words)
    ...

また、グループ要素に最初に変換値がある場合、x、y位置に大きな違いがあり、最初の変換でちらつきが発生するd3イベントからの新しい変換に置き換えられるため、最初の変換は削除されました。

これを回避するために、グループの初期位置には変換がありませんが、単語はビューポートの中心を基準にして配置されています。

.attr("transform", function(d) {
    return "translate(" + [bMidX + d.x, bMidY + d.y] + ")rotate(" + d.rotate + ")";
})

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

D3チャートをOdooFrameworkに統合する方法は?

分類Dev

d3チャートが正しく更新されない

分類Dev

D3チャートが正しく表示されない

分類Dev

d3でチャートをドラッグ&ズーム

分類Dev

値が正しくないd3マルチシリーズチャート

分類Dev

div内にd3チャートを表示する方法

分類Dev

-AJAXを使用してd3チャートを更新するための最良の方法は何ですか

分類Dev

-AJAXを使用してd3チャートを更新するための最良の方法は何ですか

分類Dev

d3 v4でフォースチャートを描く方法は?

分類Dev

d3サンバーストチャートのズーム機能を変更するにはどうすればよいですか?

分類Dev

D3:ズームジェスチャではなくパンジェスチャになるようにマウスホイールを再マップします

分類Dev

ES6クラスを使用してD3再利用可能チャートにズーム機能を追加する

分類Dev

データレンダリングのためにdc.jsをd3ホライズンチャートと統合する方法は?

分類Dev

d3ゲージチャートをレスポンシブにする方法は?

分類Dev

d3チャートを新しいデータで更新する

分類Dev

d3で複数のブラシチャートを修正する方法

分類Dev

d3でホバーしたパイセグメントのサイズを大きくする方法

分類Dev

D3 V4でズーム速度を制御する方法は?

分類Dev

d3: 積み上げグラフをズームする方法は?

分類Dev

D3を使用してバブルチャートの凡例を作成する

分類Dev

D3手動ズーム、ズームの変換を設定する方法

分類Dev

D3を使用して線でインタラクティブなチャート(ズーム/パン)を作成します

分類Dev

djangoでd3チャートを表示する

分類Dev

このD3チャートの線が更新時に正しく表示されないのはなぜですか?

分類Dev

d3チャート:d3チャートに複数のcssプロパティを設定する方法

分類Dev

円の色をカスタマイズするD3ダグナットチャート

分類Dev

d3のズームを更新している間、ズーム解除/ズーム遷移を回避します

分類Dev

d3ズームscaleExtentを正の値に設定します

分類Dev

ツールチップ付きの円をd3チャートに追加する方法

Related 関連記事

  1. 1

    D3チャートをOdooFrameworkに統合する方法は?

  2. 2

    d3チャートが正しく更新されない

  3. 3

    D3チャートが正しく表示されない

  4. 4

    d3でチャートをドラッグ&ズーム

  5. 5

    値が正しくないd3マルチシリーズチャート

  6. 6

    div内にd3チャートを表示する方法

  7. 7

    -AJAXを使用してd3チャートを更新するための最良の方法は何ですか

  8. 8

    -AJAXを使用してd3チャートを更新するための最良の方法は何ですか

  9. 9

    d3 v4でフォースチャートを描く方法は?

  10. 10

    d3サンバーストチャートのズーム機能を変更するにはどうすればよいですか?

  11. 11

    D3:ズームジェスチャではなくパンジェスチャになるようにマウスホイールを再マップします

  12. 12

    ES6クラスを使用してD3再利用可能チャートにズーム機能を追加する

  13. 13

    データレンダリングのためにdc.jsをd3ホライズンチャートと統合する方法は?

  14. 14

    d3ゲージチャートをレスポンシブにする方法は?

  15. 15

    d3チャートを新しいデータで更新する

  16. 16

    d3で複数のブラシチャートを修正する方法

  17. 17

    d3でホバーしたパイセグメントのサイズを大きくする方法

  18. 18

    D3 V4でズーム速度を制御する方法は?

  19. 19

    d3: 積み上げグラフをズームする方法は?

  20. 20

    D3を使用してバブルチャートの凡例を作成する

  21. 21

    D3手動ズーム、ズームの変換を設定する方法

  22. 22

    D3を使用して線でインタラクティブなチャート(ズーム/パン)を作成します

  23. 23

    djangoでd3チャートを表示する

  24. 24

    このD3チャートの線が更新時に正しく表示されないのはなぜですか?

  25. 25

    d3チャート:d3チャートに複数のcssプロパティを設定する方法

  26. 26

    円の色をカスタマイズするD3ダグナットチャート

  27. 27

    d3のズームを更新している間、ズーム解除/ズーム遷移を回避します

  28. 28

    d3ズームscaleExtentを正の値に設定します

  29. 29

    ツールチップ付きの円をd3チャートに追加する方法

ホットタグ

アーカイブ