4

D3で円グラフを描画していますが、テキストのクリッピング自体に問題があります。

ここに画像の説明を入力してください

これが私の描画関数です:

    pie: function(config)
    {
        var width = config.width || 840,
            height = config.height || 520,
            radius = Math.min(width, height) / 2;

        var color = this._color = d3.scale.ordinal().range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);
        var arc = d3.svg.arc().outerRadius(radius - 10).innerRadius(0);
        var pie = d3.layout.pie().sort(null).value(function(d) { return d.value; });

        var svg = d3.select("body").append("svg").attr('id', config.id || 'chart').attr("width", width).attr("height", height)
                    .append("g").attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

          var g = svg.selectAll(".arc").data(pie(config.data)).enter().append("g").attr("class", "arc");
          g.append("path").attr("d", arc).style("fill", function(d) { return color(d.data.name); });

          g.append("text")
              .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
              .attr("dy", ".35em")
              .style("text-anchor", "middle")
              .text(function(d) { return d.data.name; });
        return $('#'+(config.id || 'chart'));
    },

そのようなテキストのクリッピングを防ぐ簡単な方法はありますか?

4

1 に答える 1

6

更新:より包括的な回答のために十分なスペースがある場合は、D3 put arc labels in a Pie Chartへの回答を参照してください。


クリッピングを回避することで、要素が後続のarc<text>によって遮られてはならないことを意味する場合、DOM 内の要素の後に要素を出現させることでこれを実現できます。それを行う 1 つの方法がここに示されています: http://jsfiddle.net/tu3Pk/2/<text>.arc

g.arc-labelsここでは、ラベルを含み、DOM の後に表示される新しい要素を作成しましたg.arcs

pie: function (config) {

    // ...

    var g = svg.selectAll(".arc")
            .data(pie(config.data))
          .enter()
            .append("g")
            .attr("class", "arc");

    g.append("path")
        .attr("d", arc)
        .style("fill", function(d) { 
            return color(d.data.name); 
        });

    // Creating a new g for labels
    var gLabel = svg.selectAll('.arc-label')
                  .data(pie(config.data))
                .enter()
                  .append('g')
                  .attr('class', 'arc-label');

    gLabel.append("text")
        .attr("transform", function(d) { 
              return "translate(" + arc.centroid(d) + ")"; 
        })
        .attr("dy", ".35em")
        .style("text-anchor", "middle")
        .text(function(d) { return d.data.name; });

    // ...
}

ただし、これは読みやすさにはあまり役立ちません。ラベルをより読みやすくするために、次の質問をご覧になることをお勧めします: D3 円グラフのテキストの重複を防止する場合、解決策は次の行にあります: http://jsfiddle.net/tu3Pk/3/

// Get the angle on the arc and then rotate by -90 degrees
function getAngle(d) {
    var ang = (180 / Math.PI * (d.startAngle + d.endAngle) / 2 - 90);
    return (ang > 180) ? 180 - ang : ang;
};

// ...

pie: function (config) {

    // ...

    gLabel.append("text")
        .attr("transform", function(d) { 
              return "translate(" + arc.centroid(d) + ") " +
                     "rotate(" + getAngle(d) + ")";
        })
        .attr("dy", ".35em")
        .style("text-anchor", "middle")
        .text(function(d) { return d.data.name; });

    // ...
}
于 2013-02-10T22:01:48.590 に答える