私は正と負の値の異なるリングが含まれていますD3でドーナツグラフの特別な種類を作成しようとしています。値は100%より大きくても-100%よりも小さくすることができるので、残りの値を表す弧があります。以下は、チャートのサンプル画像です。 最初の肯定的なカテゴリ(Category_1 - 灰色)の値は80なので、次の肯定的なカテゴリのために20%を残して、灰色で80%の円を塗りつぶします。次のポジティブカテゴリ値(Category_2 - オレンジ)は160です。したがって、最初にCategory_1(残りの140の値)に20%残っています。次に、次の円(上向き)100%(今は40の値)を満たしており、残りの値(40)については、上向きの部分円を作成しています。特別ドーナツグラフ
ここで、Category_3(暗赤色)は負(-120%)なので、内接円を作成して100%(今は20値)を埋めると、残りの値(20)。私たちは別の否定的なカテゴリ(Category_4 - 赤)を持っているので、前の否定的なカテゴリ(Category_3)が終了した場所から始まり、そこから20%のエリアを埋めるでしょう。
編集3:私は非常に基本的なアークベースのドーナツグラフを作成したとの合計値が100を超えているとき、私は残りの値のための外輪を作成することができています。以下はJSFiddleリンクです:
http://jsfiddle.net/rishabh1990/zmuqze80/
data = [20, 240];
var startAngle = 0;
var previousData = 0;
var exceedingData;
var cumulativeData = 0;
var remainder = 100;
var innerRadius = 60;
var outerRadius = 40;
var filledFlag;
var arc = d3.svg.arc()
.innerRadius(innerRadius)
.outerRadius(outerRadius)
for (var i = 0; i < data.length; i++) {
filledFlag = 0;
exceedingData = 0;
console.log("---------- Iteration: " + (i + 1) + "---------");
if (data[i] > remainder) {
filledFlag = 1;
exceedingData = data[i] - remainder;
console.log("Exceeding: " + exceedingData);
data[i] = data[i] - exceedingData;
data.splice(i + 1, 0, exceedingData);
}
if(filledFlag === 1) {
cumulativeData = 0;
} else {
cumulativeData += data[i];
}
console.log("Previous: " + previousData);
console.log("Data: " + data, "Current Data: " + data[i]);
var endAngle = (previousData + (data[i]/50)) * Math.PI;
console.log("Start " + startAngle, "End " + endAngle);
previousData = previousData + data[i]/50;
//if(i===1) endAngle = 1.4 * Math.PI;
//if(i===2) endAngle = 2 * Math.PI;
var vis = d3.select("#svg_donut");
arc.startAngle(startAngle).endAngle(endAngle);
vis.append("path")
.attr("d", arc)
.attr("transform", "translate(200,200)")
.style("fill", function(d) {
if (i === 0) return "red";
//if (i === 1) return "green";
//if (i === 2) return "blue"
//if (i === 3) return "orange"
//if (i === 4) return "yellow";
});
if (exceedingData > 0) {
console.log("Increasing Radius From " + outerRadius + " To " + (outerRadius + 40));
outerRadius = outerRadius + 22;
innerRadius = innerRadius + 22;
arc.innerRadius(innerRadius).outerRadius(outerRadius);
console.log("Outer: ", outerRadius);
}
if (remainder === 100) {
remainder = 100 - data[i];
} else {
remainder = 100 - cumulativeData;
};
if (filledFlag === 1) {
remainder = 100;
}
console.log("Remainder: " + remainder);
startAngle = endAngle;
}
実装のためのいくつかのアイデアを共有してください。
2つの正の値が> 100%の場合はどうすればよいですか?同様に、カテゴリー1が180%だったら?カテゴリ2と一緒にどのように表示されますか? – meetamit
は、それは次のようになります@meetamit: http://jsfiddle.net/dw0sx79v/3/ – Rishabh
はそれを手に入れました。これは興味深い問題ですが、完全に動作する例を得るにはしばらく時間がかかります。私は助けることができると思うが、いつ私がそれに着くかわからない。たぶん明日または翌日。その間、この質問に対して賞金を支払うことを検討してください。あなたはより多くの目玉を得るでしょう – meetamit